Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 同步使用解析的承诺数据_Javascript_Asynchronous_Promise_Synchronous - Fatal编程技术网

Javascript 同步使用解析的承诺数据

Javascript 同步使用解析的承诺数据,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) { //

我正在学习承诺,我绝对希望在我继续之前,我能理解它们的用途。我正在使用一个图书馆的在线服务,它的功能,返回一个承诺

我读到的几乎所有示例都在chained
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