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)返回一个承诺,该承诺将在指定的毫秒数后解决,非常适合替换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 回答