有了Q,我可以定义一个新的承诺:
var queue = q();但如果我有蓝鸟的话
var queue = new Promise();我得到:
TypeError: the promise constructor requires a resolver function我如何才能得到与Q相同的结果?
这是我的代码片段:
var queue = q()
promises = [];
queue = queue.then(function () {
return Main.gitControl.gitAdd(fileObj.filename, updateIndex);
});
// Here more promises are added to queue in the same way used above...
promises.push(queue);
return Promise.all(promises).then(function () {
// ...
});发布于 2014-03-27 10:32:09
var resolver = Promise.defer();
setTimeout(function() {
resolver.resolve(something); // Resolve the value
}, 5000);
return resolver.promise;这一行经常在documentation中使用。
请注意,这通常是一个反模式来使用。但是如果你知道你在做什么,Promise.defer()是一种获得类似Q方法的解析器的方法。
--然而,不鼓励使用这种方法。蓝鸟甚至对此表示反对。。
相反,您应该这样做:
return new Promise(function(resolve, reject) {
// Your code
});请参阅相关的文档位:Promise.defer()和new Promise()。
在更新您的问题后,这里是您的问题:您正在重复使用相同的承诺来解决多个值。--承诺只能解决一次。--它意味着你必须尽可能多地使用Promise.defer()。
尽管如此,在看到更多的代码之后,您似乎确实在使用反模式。使用承诺的一个优点是错误处理。对于您的情况,只需要以下代码:
var gitControl = Promise.promisifyAll(Main.gitControl);
var promises = [];
promises.push(gitControl.gitAddAsync(fileObj.filename, updateIndex));
return promises;--这应该足以处理您的用例。--它要清楚得多,而且它还具有真正正确处理错误的优点。
发布于 2014-03-27 14:06:03
为了你最初的问题,弗洛里安给出了一个很好的答案,有几种方法可以用蓝知更鸟建立一个链。
最简单的方法之一是在没有任何情况下调用Promise.resolve():
var queue = Promise.resolve(); //resolve a promise with nothing or cast a value或
Promise.try(function(...){
return ...//chain here
});所以你可以:
var queue = Promise.resolve()
promises = [];
queue = queue.then(function () {
return Main.gitControl.gitAdd(fileObj.filename, updateIndex);
});
// Here more promises are added to queue in the same way used above...
promises.push(queue);
return Promise.all(promises).then(function () {
// ...
});不过,就我个人而言,我会做这样的事情:
//arr is your array of fileObj and updateIndex
Promise.map(arr,function(f){ return Main.gitControl.gitAdd(f.filename,f.updateIndex).
then (function(result){
//results here
});发布于 2017-02-14 01:43:32
当我有一种方法在因特网上获取资源并返回内容时,我发现了这一点,但我希望它能够处理连接超时,并在两次之间延迟的情况下重试多达X次。
由于不推荐Bluebird.defer,所以我使用了它来实现这个功能:
const Promise = require('bluebird');
var fetch = function (options, promise) {
var resolve, reject;
if (promise) {
resolve = promise.resolve;
reject = promise.reject;
promise = promise.promise;
} else {
promise = new Promise(function () {
resolve = arguments[0];
reject = arguments[1];
});
}
var retry = {promise: promise, resolve: resolve, reject: reject};
// Your logic here that you want to retry
if (typeof options.x === 'undefined') {
reject(new Error('X not defined'));
} else if (options.x < 3) {
options.x++;
options.retryAttempt = (options.retryAttempt || 0) + 1;
console.log(`Retrying in 1 second attempt ${options.retryAttempt}...`);
setTimeout(() => {
fetch(options, retry)
}, 1000);
} else {
resolve(options.x);
}
return promise;
}
fetch({x:0})
.then(res => {
console.log(res);
})
.catch(err => {
throw err;
});https://stackoverflow.com/questions/22684643
复制相似问题