我是承诺的新手,并试图包裹我的头脑应该是简单的事情。也许有人可以用它强烈地击中我!
我有这两个功能:
//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方法有关?我错过了什么?有人可以打我吗?
答案 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;
});