在javascript中解析值
我有以下代码:在javascript中解析值,javascript,asynchronous,callback,promise,Javascript,Asynchronous,Callback,Promise,我有以下代码: function doSomething() { //xhr here setTimeout(function() { var value = 42; }, 10); return { then: function(callback) { callback(value); } }; } doSomething().then(function(result) { log("got a result", resul
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);
});
并且不知道如何访问该值。
我需要这是基于承诺的解决方案,以便在多个地方使用
更新:
我们没有在该项目中使用任何库存在以下几个问题:
value
是传递到setTimeout
中的函数的本地值,因为您在这里声明了它。您可以通过在doSomething
中声明来解决此问题then
方法。事情发生的顺序如下:
doSomething
然后函数创建一个对象
然后
函数然后
尝试访问值
(由于声明问题,无法访问该值,但无论如何都会有问题)值
由计时器启动时的回调设置then
函数必须存储对传递给它的回调的引用,并在设置value
后调用回调(例如,承诺已实现)
与其实现您自己的promises库,我建议您使用已经编写和调试过的几个库中的一个。这里有几个问题:
value
是传递到setTimeout
中的函数的本地值,因为您在这里声明了它。您可以通过在doSomething
中声明来解决此问题then
方法。事情发生的顺序如下:
doSomething
然后函数创建一个对象
然后
函数然后
尝试访问值
(由于声明问题,无法访问该值,但无论如何都会有问题)值
由计时器启动时的回调设置then
函数必须存储对传递给它的回调的引用,并在设置value
后调用回调(例如,承诺已实现)
与其实现您自己的promises库,我建议您使用已经编写和调试过的几个库中的一个。我只是指出,为了“修复”您的问题,您需要通过以下方式返回
,然后
:
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的答案并考虑使用允诺库,也可以考虑阅读来解释承诺解决方案的样子。
也就是说:调用链接时,您的
then
需要依次返回一个承诺(而不仅仅是设置一个超时),在等待它之前,回调应该被同化。我只是指出,为了“修复”您的问题,您需要通过以下方式返回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的答案并考虑使用允诺库,也可以考虑阅读来解释承诺解决方案的样子。
也就是说:然后在调用链接时需要返回一个承诺(而不仅仅是设置一个超时),在等待回调之前,回调应该被同化。每次定义一个新函数时,您都会创建一个新的作用域,并且在该作用域内定义的变量在其外部不可用。变量在超时范围内,仅返回
then
函数并不能保证。警告-返回不符合规范的then
函数是有风险的,可能会导致意外结果。它可能工作,但它不是那么简单——考虑使用一个承诺库并读取每次定义一个新函数时,创建一个新的作用域,并且在该范围内定义的变量在它之外是不可用的。变量在超时范围内,仅返回then
函数并不能保证。警告-返回不符合规范的then
函数是有风险的,可能会导致意外结果。它可能工作,但它不是那么简单-考虑使用承诺库和阅读