处理数组后如何退出承诺序列?
How can I exit a promise sequence when the array has been processed?
我在一个脚本中实现了以下代码示例,该脚本循环遍历一组结果并为每个结果发出一个 http 请求。
function sequence(array, callback) {
return array.reduce(function chain(promise, item) {
return promise.then(function () {
return callback(item);
});
}, Promise.resolve());
};
var products = ['sku-1', 'sku-2', 'sku-3'];
sequence(products, function (sku) {
return getInfo(sku).then(function (info) {
console.log(info)
});
}).catch(function (reason) {
console.log(reason);
});
function getInfo(sku) {
console.log('Requested info for ' + sku);
//assume this function makes an http request and returns a promise
}
处理完数组中的所有项目后,脚本不会退出。我将如何调整它以实现这种情况?
我的实现进行了 API 调用和 returns 承诺:
....
}).then(function(results){
sequence(results, function(result){
checkSpam(result).then(function(akismet){
if(akismet) {
//console.log('spam returned from checkspam');
write_spam_to_file(result);
} else {
//console.log('no spam returned from checkspam');
}
})
});
}).catch(function (e) {
console.log('Error occurred:');
console.log(e);
});
function sequence(array, callback) {
return array.reduce(function chain(promise, item) {
return promise.then(function () {
return callback(item);
});
}, Promise.resolve());
}
function checkSpam(entry) {
var akismetPromise = new Promise(function resolver(resolve, reject) {
akismet.checkSpam({
user_agent: 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1',
referrer: 'http://google.com',
user_ip: entry.ip,
comment_author: entry.poster,
comment_content: entry.message,
comment_type: 'forum-post'
}, function (err, spam) {
if (err) reject(err);
resolve(spam);
});
});
return akismetPromise;
}
与您的第一个代码段相比,您的实际代码缺少一堆 return
关键字:
…
}).then(function(results) {
return sequence(results, function(result) {
// ^^^^^^
return checkSpam(result).then(function(akismet) {
// ^^^^^^
if (akismet) {
return write_spam_to_file(result);
// ^^^^^^ // assuming the write is asynchronous and returns a promise?
}
});
});
}) …
如果你不always return a promise来自异步函数(包括then
回调),promise链不知道要等待什么,并在不等待任何结果的情况下执行下一个回调.
我在一个脚本中实现了以下代码示例,该脚本循环遍历一组结果并为每个结果发出一个 http 请求。
function sequence(array, callback) {
return array.reduce(function chain(promise, item) {
return promise.then(function () {
return callback(item);
});
}, Promise.resolve());
};
var products = ['sku-1', 'sku-2', 'sku-3'];
sequence(products, function (sku) {
return getInfo(sku).then(function (info) {
console.log(info)
});
}).catch(function (reason) {
console.log(reason);
});
function getInfo(sku) {
console.log('Requested info for ' + sku);
//assume this function makes an http request and returns a promise
}
处理完数组中的所有项目后,脚本不会退出。我将如何调整它以实现这种情况?
我的实现进行了 API 调用和 returns 承诺:
....
}).then(function(results){
sequence(results, function(result){
checkSpam(result).then(function(akismet){
if(akismet) {
//console.log('spam returned from checkspam');
write_spam_to_file(result);
} else {
//console.log('no spam returned from checkspam');
}
})
});
}).catch(function (e) {
console.log('Error occurred:');
console.log(e);
});
function sequence(array, callback) {
return array.reduce(function chain(promise, item) {
return promise.then(function () {
return callback(item);
});
}, Promise.resolve());
}
function checkSpam(entry) {
var akismetPromise = new Promise(function resolver(resolve, reject) {
akismet.checkSpam({
user_agent: 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1',
referrer: 'http://google.com',
user_ip: entry.ip,
comment_author: entry.poster,
comment_content: entry.message,
comment_type: 'forum-post'
}, function (err, spam) {
if (err) reject(err);
resolve(spam);
});
});
return akismetPromise;
}
与您的第一个代码段相比,您的实际代码缺少一堆 return
关键字:
…
}).then(function(results) {
return sequence(results, function(result) {
// ^^^^^^
return checkSpam(result).then(function(akismet) {
// ^^^^^^
if (akismet) {
return write_spam_to_file(result);
// ^^^^^^ // assuming the write is asynchronous and returns a promise?
}
});
});
}) …
如果你不always return a promise来自异步函数(包括then
回调),promise链不知道要等待什么,并在不等待任何结果的情况下执行下一个回调.