web-dev-qa-db-ja.com

node.jsでQプロミスを実際に使用するにはどうすればよいですか?

これはnoobの質問かもしれませんが、私はpromiseを初めて使い、node.jsで [〜#〜] q [〜#〜] を使用する方法を見つけようとしています。

tutorial は、

_promiseMeSomething()
    .then(function (value) {}, function (reason) {});
_

しかし、_.then_がどこから来たのか正確には把握できません。から来ると思う

_var outputPromise = getInputPromise()
    .then(function (input) {}, function (reason) {});
_

しかし、getInputPromise()はどこから来たのでしょうか?私はそれの前の言及を見つけません。


私は自分のプロジェクトにそれを含めました

_var Q = require('q');

// this is suppose, the async function I want to use promise for
function async(cb) {
    setTimeout(function () {
        cb();
    }, 5000);
}

async(function () {
    console.log('async called back');
});
_

この例でQとその_.then_を使用するにはどうすればよいですか?

33
laggingreflex

promiseMeSomething()はQのpromiseオブジェクトを返します。このオブジェクトにはthen関数があり、これは defined です。

Promise.prototype.then = function (fulfilled, rejected, progressed) {

Promiseオブジェクトを作成する最も簡単な方法は、次のようにQ関数コンストラクターを使用することです

new Q(value)

新しいpromiseオブジェクトを作成します。次に、このように成功および失敗ハンドラーをアタッチできます

new Q(value)
.then(function(/*Success handler*/){}, function(/*Failure handler*/){})

さらに、単一のnodejsスタイルの関数を.then関数に渡すと、次のような成功値でその関数が呼び出されます

callback(null, value)

または問題がある場合は、

callback(error)

特定のケースでは、setTimeoutは最初のパラメーターとして呼び出される関数を受け入れます。したがって、Promiseを実際に機能させるには、かなりの数行のコードが必要です。そのため、Qには便利な関数があり、この目的のために Q.delay があり、これは次のように使用できます。

var Q = require('q');

function async() {
    return Q.delay(1000)
}

async()
.then(function() {
    console.log('async called back');
});

このように短く書くことができます

Q.delay(1000)
    .then(function() {
        console.log('async called back');
    });

他の値でコールバック関数を呼び出したい場合は、次のようにできます

Q.delay(1000, "Success")
    .then(function(value) {
        console.log('async called back with', value);
    });

これは、2つの関数の間に遅延が必要で、2番目の関数が最初の関数に依存している場合に役立ちます。

19
thefourtheye