有一些非常简化的伪ish代码可以理解我的代码的结构。
解决异步回调难题的简单方法是什么。
在requestOption中使用令牌时,令牌将为空。因此,由于缺少令牌,对requestOption的以下用法将不会给出任何结果。
var token = ''
var auth1 = someData
var auth2 = someFunc(auth1)
var auth3 = someOtherData
var auth4 = someOtherFunc(auth3)
var finalAuth = someFinalData
var finalAuth2 = finalAuth.someFinalFunc(auth4, cb)
cb.onSuccess(result)
token = result.getToken()
var requestOption = {
someData: ...,
'authToken': token,
someMoreData: ...
}
req = request.post(requestOption)
有很多解决方案,其中大多数包括使用函数的扩展。
模块化身份验证和在另一个文件中处理请求也许很有用。
但是我想保持简单,不要依赖这样的东西
var empty = ''
var data = 'xyz'
auth(data, {
onSuccess: function(res) {
doSomething(res)
}
})
function doSomething(var) {
// do something
}
到目前为止,我发现的内容如果不使我的代码过于复杂就无法解决问题。
答案 0 :(得分:0)
如果您不想处理promise和回调,则将函数标记为异步然后等待结果,这是语法糖为您神奇地包装了promise。处理诸如post之类的异步函数时,有些将不得不等待响应。
答案 1 :(得分:0)
您应该在成功回调中包含您的请求逻辑。对于您来说,带有请求和请求选项的代码将在设置令牌的值之前执行,因为auth函数是异步的,服务器需要一些时间来响应。
答案 2 :(得分:0)
基本JavaScript将为您提供三个主要选项来处理异步行为。
function callback() {
console.log('do this');
setTimeout(() => console.log('later do this'), 2000);
}
callback();
一个带有两个函数参数的函数声明了promise-解析和拒绝。 Resolve用于以有效载荷作为参数来正常解析承诺,然后在链接的.then( ... )
函数中可用。拒绝可以用于例外地解决承诺。有关更多说明和示例,请参见Mozilla docs on Promises。
function asynchronousFunction() {
return new Promise( (resolve, reject) => {
setTimeout( () => {
return resolve('then do this');
}, 2000);
});
}
function promise() {
console.log('do this');
asynchronousFunction()
.then((data) => console.log(data));
};
promise();
function asynchronousFunction() {
return new Promise( (resolve, reject) => {
setTimeout( () => {
return resolve('then do this');
}, 2000);
});
}
/**
* async functions implicitly return promises with the return value being the resolved value
await keyword will implicitly unwrap the promise when it resolves and (to some degre) pause execution to until resolution
*/
async function asyncFunction() {
console.log('do this');
console.log(await asynchronousFunction());
};
asyncFunction();
它的骨感:
对于一般用途的东西来说,回调是可以的,而在幕后,这才是真正的工作方式。了解回调对于理解JavaScript很重要。但是,对于高度异步的应用程序,由于嵌套行为,可能很难理解执行代码的顺序。
Promise解决了前一个问题,但在代码中增加了自己的复杂性。您应谨慎使用有效的Promise,以使代码更具可读性。如果使用不当,有时会妨碍代码的可读性。通常,这种结构比无尽的回调更好,但仍不如同步代码易读和组织。
Async / await从根本上是承诺,但对用户而言是隐藏的。这些工具可以使您的代码更容易阅读,但是您需要从根本上理解承诺,才能真正理解其工作原理。这样做的最大好处是代码开始看起来更像同步代码,并且使它更容易关注内部逻辑而不是异步行为。