8

「q」(https://github.com/kriskowal/q)のJavaScript用のpromiseライブラリの使用方法を理解する上でいくつか問題があります。

var delayOne = function() {
    setTimeout(function() {
        return 'hi';
    }, 100);
};

var delayTwo = function(preValue) {
    setTimeout(function() {
        return preValue + ' my name';
    }, 200);
};

var delayThree = function(preValue) {
    setTimeout(function() {
        return preValue + ' is bodo';
    }, 300);
};

var delayFour = function(preValue) {
    setTimeout(function() {
        console.log(preValue);
    }, 400);

};

Q.fcall(delayOne).then(delayTwo).then(delayThree).then(delayFour).end();

これは未定義のみを返します...

4

2 に答える 2

12

wroniastyが指摘したように、これらの各関数からpromiseを返す必要がありますが、コールバック指向のAPI(などsetTimeout)を可能な限り抽象化し、代わりにpromiseを返すAPIを使用する必要があります。

の場合setTimeout、Qはすでに提供Q.delay(ms)されており、指定されたミリ秒数後に解決されるpromiseを返します。これは、次の置換に最適ですsetTimeout

var delayOne = function() {
    return Q.delay(100).then(function() {
        return 'hi';
    });
};

var delayTwo = function(preValue) {
    return Q.delay(200).then(function() {
        return preValue + ' my name';
    });
};

var delayThree = function(preValue) {
    return Q.delay(300).then(function() {
        return preValue + ' is bodo';
    });
};

var delayFour = function(preValue) {
    return Q.delay(400).then(function() {
        console.log(preValue);
    });
};

Q.fcall(delayOne).then(delayTwo).then(delayThree).then(delayFour).done();

(注:endに置き換えられましたdone

于 2013-01-24T09:38:12.890 に答える
9

「未定義」になる理由は、チェーンしている関数が何も返さないためです。

var delayOne = function() {
  setTimeout(function() {
    return 'hi';
  }, 100);
};

delayOneを呼び出しsetTimeout、何も返しません(undefined)。

あなたの目標を達成するためにあなたは使用しなければなりませんQ.defer

var delayOne = function() {
  var d = Q.defer();    
  setTimeout(function() {
    d.resolve("HELLO");
  }, 100);
  return d.promise;
};

var delayTwo = function(preValue) {
   setTimeout(function() {
     alert(preValue);
   }, 
   400);
};

delayOne().then ( delayTwo );

http://jsfiddle.net/uzJrs/2/

于 2012-09-17T15:04:51.650 に答える