为什么 .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>
我有一个我想要 运行 的承诺链,当它完成时,我 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>