为什么 .then() 根本没有为我的 Promise 执行?

Why is .then() not executing at all for my Promise?

我有一个我想要 运行 的承诺链,当它完成时,我 resolve Promise(请参阅下面的代码了解更多上下文),并期待我的 .then() 块到 运行... 但它没有。 这是我的代码:


function notifications_for_each_in_array(iteration, the_array, error_array) {
    
    return new Promise(function(resolve, reject) {

        if(!iteration) iteration = 0;
        var error_array = error_array || [];

        var user_id = the_array[iteration];

        $.ajax({
            url: ".....my_url.....",
            type: "PUT",
            data: JSON.stringify({test: [user_id]}),
            success: function() {
                // ...
            }

        }).done(function(rez) {
            error_array.push(rez);

            iteration++;

            console.log("will stop: " + (the_array[iteration] == undefined));

            if(the_array[iteration] == undefined) { // reached the end
                console.log("Resolving...");
                resolve(error_array);
            } else {
                if(the_array[iteration] != undefined) {
                    console.log("Next: " + iteration);
                    notifications_for_each_in_array(iteration, the_array, error_array);
                } 
            }
            
            
        }).fail(function(err) {
            console.error(err);
        });
    });
}

上面的函数有效,但是当我用 .then() 调用它时,.then() 块没有 运行。 在此示例中,我从未收到警报(PS:我也尝试将 notifications_for_each_in_array 定义为 async 函数,并使用 await,但我得到相同的结果):

notifications_for_each_in_array(0, [0,1,2,3], [])
.then(function(res) {
    alert("here is then()"); // I never get alerted!
});

你的代码太复杂了。基本上你需要做的就是遍历输入数组并使用 async/await 到 运行 全部。

这是一个演示,演示了在循环中执行此操作是多么容易。您的 $.ajax 调用支持 async/await,如我对 httpbin 的虚假调用所示。另请注意,我从未明确创建一个新的 Promise 这一切都是通过将函数声明为 async.

来为您完成的

async function notifications_for_each_in_array(arr) {
  const errors = [];
  for(var i=0;i<arr.length;i++) {  
     var result = await makeAjaxCall(arr[i]);
     errors.push("response from:" + result.args.id);
  }
  return errors;
}

const makeAjaxCall = (data) => {
  return $.ajax({
    url:"https://httpbin.org/get?id=" + data,
    method:"GET",
    type:"JSONP"
  })
}

const demo = async () => {
  var result = await notifications_for_each_in_array([0,1,2,3]);
  console.log(result);
}

demo()
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

您还应该注意,实际上没有必要在执行下一个之前等待每个 http 调用。你可以让它们全部并行!

async function notifications_for_each_in_array(arr) {
  const errors = await Promise.all(
    arr.map(async data => {    
      const res = await makeAjaxCall(data)
      return "response from: " + res.args.id;    
    })
  );
  
  return errors;
}

const makeAjaxCall = (data) => {
  return $.ajax({
    url:"https://httpbin.org/get?id=" + data,
    method:"GET",
    type:"JSONP"
  })
}

const demo = async () => {
  var result = await notifications_for_each_in_array([0,1,2,3]);
  console.log(result);
}

demo()
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>