首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >定义空蓝鸟承诺,如Q中所示

定义空蓝鸟承诺,如Q中所示
EN

Stack Overflow用户
提问于 2014-03-27 10:22:52
回答 4查看 17K关注 0票数 36

有了Q,我可以定义一个新的承诺:

代码语言:javascript
复制
var queue = q();

但如果我有蓝鸟的话

代码语言:javascript
复制
var queue = new Promise();

我得到:

代码语言:javascript
复制
TypeError: the promise constructor requires a resolver function

我如何才能得到与Q相同的结果?

这是我的代码片段:

代码语言:javascript
复制
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 () {
   // ...
});
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-03-27 10:32:09

代码语言:javascript
复制
var resolver = Promise.defer();
setTimeout(function() {
    resolver.resolve(something); // Resolve the value
}, 5000);
return resolver.promise;

这一行经常在documentation中使用。

请注意,这通常是一个反模式来使用。但是如果你知道你在做什么,Promise.defer()是一种获得类似Q方法的解析器的方法。

--然而,不鼓励使用这种方法。蓝鸟甚至对此表示反对。

相反,您应该这样做:

代码语言:javascript
复制
return new Promise(function(resolve, reject) {
    // Your code
});

请参阅相关的文档位:Promise.defer()new Promise()

在更新您的问题后,这里是您的问题:您正在重复使用相同的承诺来解决多个值。--承诺只能解决一次。--它意味着你必须尽可能多地使用Promise.defer()

尽管如此,在看到更多的代码之后,您似乎确实在使用反模式。使用承诺的一个优点是错误处理。对于您的情况,只需要以下代码:

代码语言:javascript
复制
var gitControl = Promise.promisifyAll(Main.gitControl);
var promises = [];
promises.push(gitControl.gitAddAsync(fileObj.filename, updateIndex));
return promises;

--这应该足以处理您的用例。--它要清楚得多,而且它还具有真正正确处理错误的优点。

票数 23
EN

Stack Overflow用户

发布于 2014-03-27 14:06:03

为了你最初的问题,弗洛里安给出了一个很好的答案,有几种方法可以用蓝知更鸟建立一个链。

最简单的方法之一是在没有任何情况下调用Promise.resolve()

代码语言:javascript
复制
var queue = Promise.resolve(); //resolve a promise with nothing or cast a value

代码语言:javascript
复制
Promise.try(function(...){
    return ...//chain here
});

所以你可以:

代码语言:javascript
复制
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 () {
   // ...
});

不过,就我个人而言,我会做这样的事情:

代码语言:javascript
复制
//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
    });
票数 37
EN

Stack Overflow用户

发布于 2017-02-14 01:43:32

当我有一种方法在因特网上获取资源并返回内容时,我发现了这一点,但我希望它能够处理连接超时,并在两次之间延迟的情况下重试多达X次。

由于不推荐Bluebird.defer,所以我使用了它来实现这个功能:

代码语言:javascript
复制
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;
    });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22684643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档