解析 javascript 中的值
Resolve value in javascript
我有以下代码:
function doSomething() {
//xhr here
setTimeout(function() {
var value = 42;
}, 10);
return {
then: function(callback) {
callback(value);
}
};
}
doSomething().then(function(result) {
log("got a result", result);
});
并且不知道如何访问该值。
我需要这是基于承诺的解决方案,以便在多个地方使用
JSFidle link
更新:
我们没有在该项目中使用任何库
那里有几个问题:
value
是您传递给 setTimeout
的函数的局部变量,因为这是您声明它的地方。您可以通过在 doSomething
中声明来解决此问题。
更大的问题是你所拥有的不是承诺,它只是一个函数,当你调用它时 return 是一个具有 then
的对象方法。这是事情发生的顺序:
你打电话给doSomething
它设置一个定时器来设置一个值。
它创建了一个带有then
函数的对象。
它return是对象。
你立即调用then
函数。
then
尝试访问 value
(由于声明问题,它不能访问,但无论如何都会有问题)。
稍后,value
由计时器触发时的回调设置。
要成为一个承诺,对象 return 上的 then
函数必须存储对传递给它的回调的引用,并在 稍后,当value
已经设置(例如,承诺已经实现)。
与其实现自己的 promises 库,我建议使用已经编写和调试过的几个之一。
我只是指出,为了 "fix" 您的问题,您需要 return then
这样:
function doSomething() {
//xhr here
return {
then: function(callback) {
setTimeout(function() {
callback(42); // callback from within the async action
}, 10);
}
};
}
doSomething().then(function(result) {
log("got a result", result);
});
请阅读 TJ 的回答并考虑使用 promise 库 - 还可以考虑阅读 this post,它解释了 promise 解析的样子。
即:您的 then
需要依次 return 调用时的承诺(而不是仅仅设置超时)以进行链接,并且回调应该在等待它之前被同化。
我有以下代码:
function doSomething() {
//xhr here
setTimeout(function() {
var value = 42;
}, 10);
return {
then: function(callback) {
callback(value);
}
};
}
doSomething().then(function(result) {
log("got a result", result);
});
并且不知道如何访问该值。 我需要这是基于承诺的解决方案,以便在多个地方使用 JSFidle link
更新: 我们没有在该项目中使用任何库
那里有几个问题:
value
是您传递给setTimeout
的函数的局部变量,因为这是您声明它的地方。您可以通过在doSomething
中声明来解决此问题。更大的问题是你所拥有的不是承诺,它只是一个函数,当你调用它时 return 是一个具有
then
的对象方法。这是事情发生的顺序:你打电话给
doSomething
它设置一个定时器来设置一个值。
它创建了一个带有
then
函数的对象。它return是对象。
你立即调用
then
函数。then
尝试访问value
(由于声明问题,它不能访问,但无论如何都会有问题)。稍后,
value
由计时器触发时的回调设置。
要成为一个承诺,对象 return 上的
then
函数必须存储对传递给它的回调的引用,并在 稍后,当value
已经设置(例如,承诺已经实现)。
与其实现自己的 promises 库,我建议使用已经编写和调试过的几个之一。
我只是指出,为了 "fix" 您的问题,您需要 return then
这样:
function doSomething() {
//xhr here
return {
then: function(callback) {
setTimeout(function() {
callback(42); // callback from within the async action
}, 10);
}
};
}
doSomething().then(function(result) {
log("got a result", result);
});
请阅读 TJ 的回答并考虑使用 promise 库 - 还可以考虑阅读 this post,它解释了 promise 解析的样子。
即:您的 then
需要依次 return 调用时的承诺(而不是仅仅设置超时)以进行链接,并且回调应该在等待它之前被同化。