Javascript 同步使用解析的承诺数据
我正在学习承诺,我绝对希望在我继续之前,我能理解它们的用途。我正在使用一个图书馆的在线服务,它的功能,返回一个承诺 我读到的几乎所有示例都在chainedJavascript 同步使用解析的承诺数据,javascript,asynchronous,promise,synchronous,Javascript,Asynchronous,Promise,Synchronous,我正在学习承诺,我绝对希望在我继续之前,我能理解它们的用途。我正在使用一个图书馆的在线服务,它的功能,返回一个承诺 我读到的几乎所有示例都在chainedthen()函数中使用解析数据 const result = Library.functionReturningAPromise() result.then(function(res) { const obj = new Example(res) return obj }).then(function(ob) { //
then()函数中使用解析数据
const result = Library.functionReturningAPromise()
result.then(function(res) {
const obj = new Example(res)
return obj
}).then(function(ob) {
// do the rest of the logic within these then() functions
})
或者在async
函数中使用解析的数据
async function test() {
const result = await Library.functionReturningAPromise()
const obj = new Example(result)
// do the rest of the logic
}
我想知道是否有任何方法可以在“正常”同步代码中使用解析承诺中的数据
const result = Library.functionReturningAPromise()
// do something to resolve the promise
const obj = new Example(result)
或者,如果您需要始终“包装”在async
函数中使用解析承诺数据的所有逻辑。如果您想“离开”异步上下文,您可以等待承诺实现,然后()调用一个“常规”函数作为回调
我可以理解异步编码风格可能非常混乱,但实际上这正是then(function(){})
所做的
如果这种编码风格更容易理解或使用,那么它在功能上是等效的
function first() {
console.log("sync!");
doAsync();
}
function doAsync() {
console.log("now we're async!");
Library.functionReturningAPromise().then(second);
}
function second() {
console.log("sync again!");
// ...
}
我想知道是否有任何方法可以在“正常”同步代码中使用解析承诺中的数据
在处理异步响应时,没有一种方法可以编写完全同步的代码。一旦任何操作是异步的,您就必须使用异步技术来处理响应,并且不能同步编程。你必须学会异步编程
您显示的两个选项(.then()
或async/await
)是处理返回承诺的两个选择
或者,如果您需要在异步函数中始终“包装”使用已解析承诺中的数据的所有逻辑
如果您想使用wait
来编写处理承诺的同步代码,那么所有这些代码都必须在async
函数中。并且,一旦您离开该函数的作用域(比如想要返回一个值),您将从async
函数返回一个承诺,并且再次必须处理该承诺
这是没有办法的。这只是Javascript中必须学习的东西。过了一会儿,它就变成了第二天性
正如您所知,您可以使用async
和await
来获得一些同步的逻辑流,但是在执行此操作时,有一些事情需要确保您理解。从你的例子来看:
async function test() {
const result = await Library.functionReturningAPromise()
const obj = new Example(result);
// do the rest of the logic
}
使用async
声明的所有函数都返回一个承诺。这是你从他们那里得到的唯一回报。如果调用者正在寻找返回值,或者想要知道异步操作何时完成或者正在寻找错误,那么他们必须在异步函数中使用返回的承诺。然后()
,.catch()
,或者再次使用等待
如果您正在等待的承诺被拒绝,它将抛出并中止函数的其余执行,然后返回拒绝返回的承诺
如果您希望执行流中止被拒绝的承诺,并且调用者将处理拒绝,那么这一切都没有问题
但是,如果打电话的人没有处理拒绝,那么某人需要处理。如果您使用的是wait
,并且需要在本地处理拒绝,那么您需要将它们包装在try/catch
(非常类似于同步异常的语法)
下面是一个使用try/catch
和wait
在本地处理错误的示例:
async function test() {
try {
const result = await Library.functionReturningAPromise();
const obj = new Example(result);
// do the rest of the logic
} catch(e) {
// handle promise rejection here
}
}
以下是调用者处理错误的示例:
async function test() {
const result = await Library.functionReturningAPromise();
const obj = new Example(result);
// do the rest of the logic
}
test().then(() => {
console.log("all done");
}).catch(err => {
console.log(err);
});
如果将async/await
和then()
组合使用在返回默认值的函数中,则可以同步编程
下面是一个示例,它利用备忘录返回结果或在需要时查询结果:
const范围={
//someResult被包装在一个对象中,这样即使它是一个基本体,也可以对其进行设置
//(例如,数字/字符串)。
someResult:null,
};
函数getResult(){
if(scope.someResult!==null){
//如果已经有结果,请返回它。无需再次查询库。
返回scope.someResult;
}
//注意:此示例不实现去抖动(避免在执行时重复库查询)
//库仍在查询中)。
queryLibrary()。然后(结果=>{
if(scope.someResult==null){
//如果库调用成功,但我们尚未存储其结果,请存储它。
scope.someResult=结果;
log('我们现在有一个结果!',getResult());
}
});
返回scope.someResult;
}
异步函数queryLibrary(){
const result=等待函数returningagreement();
//用一种很好的异步/等待方式处理结果。
结果:推送(9000,1336);
返回结果;
}
/**这是库中的一些复杂异步函数*/
异步函数functionReturningAPromise(){
返回[419,70];
}
//调用getResult()将返回null或数字列表。
log('我们有结果了吗?',getResult());
“我想知道是否有任何方法可以在‘正常’同步代码中使用解析承诺中的数据”不,不可能。无论您是否通过承诺访问结果,当结果异步可用时,这意味着它现在(同步)不可用,也不可能可用。编写Library.functionreturningagreement()。然后(
…etc)将解决您的问题。您可以添加任意多个“then”(或任何其他有效选项)根据您的喜好对promise进行回调。据我所知,问题不是从异步函数获取数据,而是在异步位之后处理数据。的异步方式。如果您不习惯,那么
-链接和通用编码样式可能会让人困惑。即使您习惯了,也会时不时地出现这种情况有人可能是g