从.apply方法返回一个promise

时间:2015-08-20 15:55:36

标签: javascript promise

我是承诺的新手,并试图包裹我的头脑应该是简单的事情。也许有人可以用它强烈地击中我!

我有这两个功能:

//an arbitrary method that runs on delay to mimic an async process
    method1 = function( _value, _callback ){
      setTimeout(function(){ 
        console.log('dependency1_resolved');
        _callback.apply(this, [{valIs:_value}]);
      }.bind(this), (Math.random() * 1000));
    };

    //something that can simple return the object
    function returnVal(x){
       console.log(x); //this logs 'Object {valIs: 4}'
       return x;
    }

由于它的异步特性,我希望在我的代码中稍后使用(甚至可能更晚链)的承诺中运行此函数。

这是我的承诺:

var promise = new Promise(
  function(resolve, reject) {
    var x = method1(4, returnVal);
    resolve(x);
  }
);

promise.then(function(val) {
  console.log(val); // undefined
  return val;
});
console.log(promise); //Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: undefined}

这是否与第一个函数中的.apply方法有关?我错过了什么?有人可以打我吗?

2 个答案:

答案 0 :(得分:0)

您的returnVal回调实际上没有做任何事情。

相反,您需要实际传递一个接受值的回调:

var promise = new Promise(
  function(resolve, reject) {
    method1(4, function(x) { resolve(x); });
  }
);

您也可以将resolve本身作为回调传递:

var promise = new Promise(
  function(resolve, reject) {
    method1(4, resolve);
  }
);

答案 1 :(得分:0)

您的method1确实没有返回任何内容,这就是x未定义的原因。 returnVal回调确实返回了一些内容是微不足道的,method1只是忽略了它的返回值。

您需要调用resolve作为回调以使代码正常工作:

new Promise(
  function(resolve, reject) {
    var x = method1(4, resolve);
  }
).then(function(val) {
  console.log(val); // undefined
  return val;
});

另见How do I return the response from an asynchronous call?