36

QI を使用すると、次の新しいプロミスを定義できます。

var queue = q();

しかし、Bluebird を使用すると、次のようになります。

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 () {
   // ...
});
4

4 に答える 4

37

Florian が適切な回答を提供してくれました。最初の質問のために、Bluebird でチェーンを開始するにはいくつかの方法があります。

最も単純なものの 1 つは、何も呼び出さ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
    });
于 2014-03-27T14:06:03.680 に答える
23
var resolver = Promise.defer();
setTimeout(function() {
    resolver.resolve(something); // Resolve the value
}, 5000);
return resolver.promise;

この行はドキュメントでよく使われます。

これは通常、それを使用するためのアンチパターンであることに注意してください。しかし、あなたが何をしているのかを知っていれば、Promise.defer()Qの方法に似たリゾルバーを取得する方法です。

ただし、この方法を使用することはお勧めできません。ブルーバードはそれを非推奨にさえしました。

代わりに、次の方法を使用する必要があります。

return new Promise(function(resolve, reject) {
    // Your code
});

関連するドキュメントのビットを参照してください: Promise.defer()およびnew Promise()


質問の更新後、問題は次のとおりです。同じ約束を再利用して複数の値を解決しています。Promise は一度しか解決できません。Promise.defer()これは、promise がある回数だけ使用する必要があることを意味します。

とはいえ、あなたのコードをさらに見ると、本当にアンチパターンを使用しているようです。promise を使用する利点の 1 つは、エラー処理です。あなたの場合、次のコードが必要です。

var gitControl = Promise.promisifyAll(Main.gitControl);
var promises = [];
promises.push(gitControl.gitAddAsync(fileObj.filename, updateIndex));
return promises;

これは、ユースケースを処理するのに十分なはずです。はるかに明確であり、エラーを実際に正しく処理できるという利点もあります。

于 2014-03-27T10:32:09.407 に答える