6

Q promise の仕組みを誤解していると思います。次の約束が始まる前に最初の約束を解決したいのですが、それは実現していません。これが私のコードです:

var Q = require('q');

function doWork(taskName) {
  var deferred = Q.defer();
  console.log('starting', taskName);
  setTimeout(function() { 
    console.log('done with', taskName);
    deferred.resolve(); 
  });

  return deferred.promise;
}

doWork('task one')
  .then(doWork('task two'))
  .then(function() { console.log('all done'); });

このコードは以下を生成します。

$ node test.js 
  starting task one
  starting task two
  done with task one
  done with task two
  all done

私はそれが生成することを願っています:

$ node test.js 
  starting task one
  done with task one
  starting task two
  done with task two
  all done

私は何を間違っていますか?

4

3 に答える 3

7

これは機能します:

doWork('task one')
  .then(function() {
    return doWork('task two')
  })
  .then(function() {
    console.log('all done'); 
  });

これは理にかなっています。Qが完了するまで待機する機会を与えるのではなく、doWork直接呼び出すだけthen()ですぐにタイムアウトが発生します。task one

于 2013-03-11T23:56:51.700 に答える
1

qrequestを使用したサンプル コード

var Q       = require('q'),
    request = require('request'),
    api     = {};


api.post = function (options) {

    var deferred = Q.defer();

    request.post(options, function (error, response, body) {
            error ? deferred.reject(error) : deferred.resolve(body);
    });

    return deferred.promise;
};

api.get = function (options) {
    var deferred = Q.defer();

    request.post(options, function (error, response, body) {
            error ? deferred.reject(error) : deferred.resolve(response);
    });

    return deferred.promise;
}

api
    .post({url: 'https://foo.com'})
    .then(function (body) {
            console.log(body);
            return api.get({url: 'http://myspace.hell'});
    }, function (error) {
            //error handling logic
    })
    .then(function (response) {
            console.log(response);
    }, function (error) {
            //error handling logic
    })
    .done(); //when you are done

上記のコードでは、 getpostという 2 つの API メソッドを定義していることがわかります。

requestライブラリを使用しています。

  • 私の投稿APIメソッドは、request.post()によって返された応答オブジェクトの本体で約束を解決します
  • 私のget api メソッドは、request.get() 呼び出しの応答で約束を解決します

promise を使用して、これら 2 つの API 呼び出しを連鎖させる方法を正確に確認できます。

最初のプロミスでは、プロミスをチェーンできるように、2 番目のプロミスを返します

于 2015-06-11T15:22:44.110 に答える