Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.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 调用异步函数的客户端代码是否需要使用wait?_Javascript_Node.js_Promise_Async Await - Fatal编程技术网

Javascript 调用异步函数的客户端代码是否需要使用wait?

Javascript 调用异步函数的客户端代码是否需要使用wait?,javascript,node.js,promise,async-await,Javascript,Node.js,Promise,Async Await,想象一下下面假设的一个函数的最小实现,该函数使用axios执行一个简单的HTTP GET请求。这使用了wait/async,如本文所述 const axios = require('axios') exports.getStatus = async id => { const resp = await axios.get( `https://api.example.com/status/${id}` ) return resp } 是否未使用wait解决承诺?是否

想象一下下面假设的一个函数的最小实现,该函数使用axios执行一个简单的HTTP GET请求。这使用了
wait/async
,如本文所述

const axios = require('axios')

exports.getStatus = async id => {
  const resp = await axios.get(
    `https://api.example.com/status/${id}`
  )

  return resp
}
是否未使用
wait
解决承诺?是否要求客户使用
wait
,如下所示?假设客户机在任何时候使用异步函数时,调用该函数时也需要使用
wait
,这样安全吗

// client
const { getStatus } = require('./status')

const response = await getStatus(4)
简短的回答是否定的。 标记函数
async
意味着两件事:

1) 您可以在函数中使用
wait

2) 函数返回一个
承诺
;i、 e.您可以在其返回值上使用wait,也可以使用
.then
,或
Promise.all
,甚至可以忽略返回值,或者您可以使用promises执行的任何其他操作

例如,您可以执行以下操作(取决于您的用例),因为它不需要等待响应继续,因此性能可能会更好

// client
const { getStatus } = require('./status')

const response4 = getStatus(4);
const response5 = getStatus(5);

// do stuff that don't rely on the responses.

response4.then(response => myOutput.setFirstOutput(response));
response5.then(response => myOutput.setSecondOutput(response));

顺便说一句,您的第一个代码段由于使用了
wait
,所以是多余的;相当于

const axios = require('axios')

exports.getStatus = id =>
  axios.get(`https://api.example.com/status/${id}`);
这是因为
返回等待承诺
等同于
返回承诺
,两者都返回相同的承诺。关于被拒绝的承诺,有一个例外。等待被拒绝的承诺将引发异常(您可以使用
try/catch
块捕获),而直接返回被拒绝的承诺不会引发异常,但您仍应处理拒绝(使用
.catch
子句)。举例说明:

let promise=new promise(解析=>setTimeout(()=>resolve('2秒后解析'),2000));
让我们的承诺=()=>承诺;
让returnAwaitPromise=async()=>AwaitPromise;
returnPromise()。然后(value=>console.log('returnPromise',value));

returnAwaitPromise()。然后(value=>console.log('returnAwaitPromise',value))不,不需要使用wait。异步函数返回应解析的承诺。不使用wait,只需调用
.then()
,如下所示:

// client
const { getStatus } = require('./status');

getStatus(4).then((response) => {
    //Do something with the response
}).catch((error) => {
    //Handle possible exceptions
});
下面我将从评论中回答您的问题。
getStatus
函数可以这样重写:

exports.getStatus = (id) => {
    return new Promise((resolve, reject) => {
        axios.get(`https://api.example.com/status/${id}`).then((resp) => {
            resolve(resp);
        }).catch((error) => {
            reject(error);
        })
    });
}

它的作用与您的版本完全相同。当您串联调用异步函数时,必须解析每个返回的承诺。在您的例子中,有两种方法—一种是通过
axios.get
返回的,另一种是通过
getStatus
返回的

不,你不必这么做。异步函数执行并等待,直到返回错误或完成执行并返回响应

所有
async
函数都使用隐式承诺返回结果。“假设客户机在任何时候使用异步函数,调用该函数时也需要使用wait,这是否安全?”-正确,假设您依赖于结果。您必须将结果作为承诺来处理,无论是使用
wait
还是像
这样的回调@TylerRoper这就是我困惑的地方。调用
axios.get(…)
时,
wait
声明不是解决了这个承诺吗?为什么消费代码也需要解决它?这里有两个承诺:一个是由
axios.get
返回的(由
wait
解决),另一个是由
exports.getStatus
返回的。也许这是一个糟糕的类比,但想象一下你打电话给我说“打电话给当地市场,看看他们有没有面包。”。所以我打电话给他们,等待他们的回答。但你还是得等我给你答复,对吗?或者,我可以给你回电话(回电话)。谢谢你。因为
axios.get()
返回了一个承诺,所以它是多余的吗?我似乎无法编辑我的第一条评论,但如果您有时间,我很想了解为什么我使用wait是多余的。添加了解释