我已经把Promise搞砸了,但我是他们的新手,我无法弄清楚如何正确地做到这一点。目前,Promise没有意义,因为它不会等到异步$.get
完成。
基本上,每个foreach
迭代都有自己的$.get
函数,我需要将它们全部完成,然后继续使用“...得到albumart”的部分{{1} }。
console.log
答案 0 :(得分:20)
在同步代码中,当行结束;
通过承诺,继续通过.then
执行。您正在使用promise构造函数并立即解决它,您根本没有等待任何任务。我将我的工作映射到任务中,然后将它们链接起来或者连续等待它们。
//I'm assuming
zippyarray; // array of Zippy objects
var tasks = zippyarray.map(function(zippy,i){
return function(){ // return a task on that zippy;
// basic logic here
return $.get({
// ajax request
}).then(function(data){
// process data like in your code
// possibly store later for later use too
return process(data); // return the processed data;
});
}
});
现在我们可以按顺序执行它们了:
var p = tasks[0](); // start the first one
for(var i = 1; i < tasks.length; i++) p = p.then(tasks[i]);
p.then(function(result){
// all available here
});
或者更好,连续:
$.when.apply(tasks.forEach(function(t){ return t(); })).then(function(results){
// all done
})
答案 1 :(得分:10)
我知道这是一个老问题,但最近情况发生了一些变化。
如果你使用外部库很好, Bluebird promise库有一个非常好的实现:Promise.each。
E.g。
function helperFunc(zippyarray) {
return Promise.each(zippyarray, zippy => {
return someOperationThatReturnAPromise(zippy)
.then((singleResult) => {
// do something with the operation result if needed
})
}).then((originalArray) => {
// this happens only after the whole array is processed
// (result is the original array here)
return Promise.resolve(originalArray)
})
}
答案 2 :(得分:0)
要跟踪您使用这种方式的多个get-Requests:
var cnt = requestCnt;
function finished(){
if(--cnt)return;
// Your code here
}
for(var i = 0; i < requestCnt; ++i){
$.get('something.htm', {data:data}, function(data){
finished();
});
}
当请求得到答案时,您总是调用finished-function。完成功能完成所有工作后就完成了工作。
答案 3 :(得分:0)
今天如果我需要按顺序执行 - 我会使用async/await
:
//I'm assuming I'm inside an `async` function
zippyarray; // array of Zippy objects
for(const task of zippyArray) {
const result = await $.get({ ... });
// do stuff with result
}