Javascript jsasync(async/await)返回承诺,但也执行函数
JavaScript异步函数返回承诺,但也执行该函数。这有点违背了目的。请解释一下。还有一种方法可以通过仅使用async/await(非promise)返回承诺而不执行Javascript jsasync(async/await)返回承诺,但也执行函数,javascript,node.js,async-await,Javascript,Node.js,Async Await,JavaScript异步函数返回承诺,但也执行该函数。这有点违背了目的。请解释一下。还有一种方法可以通过仅使用async/await(非promise)返回承诺而不执行 函数等待(毫秒){ var start=new Date().getTime(); var结束=开始; 同时(结束{ console.log(“开始fn”,值) 等待(2000年); console.log(“结束fn”,值) 返回值; } 常量main=async()=>{ var promiseForFn=fn(3); 日
函数等待(毫秒){
var start=new Date().getTime();
var结束=开始;
同时(结束<开始+毫秒){
end=新日期().getTime();
}
}
常数fn=async(值)=>{
console.log(“开始fn”,值)
等待(2000年);
console.log(“结束fn”,值)
返回值;
}
常量main=async()=>{
var promiseForFn=fn(3);
日志(“promiseForFn”,promiseForFn);
var值=等待承诺fn;
console.log(“值”,value);
}
main()
或
const wait=async(ms)=>{
var start=new Date().getTime();
var结束=开始;
同时(结束<开始+毫秒){
end=新日期().getTime();
}
}
常数fn=async(值)=>{
console.log(“开始fn”,值)
等待等待(2000年);
console.log(“结束fn”,值)
返回值;
}
常量main=async()=>{
var promiseForFn=fn(3);
日志(“promiseForFn”,promiseForFn);
var值=等待承诺fn;
console.log(“值”,value);
}
main()
答案是,将函数标记为async
并不是使其真正异步的原因。多亏了另一个人
async关键字只能用于在代码块中使用wait的函数。在您的情况下,“wait”函数是同步的(并阻止事件循环),因此不需要使用async字。async关键字应仅用于代码块中使用wait的函数。在您的情况下,“wait”函数是同步的(并阻止事件循环),因此不需要异步字。
- 有许多方法可以实现代码的异步性。回调、内置函数(如
)和setTimeout
是一些常见的函数Promises
- 将函数标记为
并不是使其真正异步的原因。它允许您在希望等待承诺的地方使用关键字async
wait
- 是的,
只能与await/async
一起使用。它们对于以命令式(sync)样式表示应用于异步代码的分支和更复杂的流控制非常有用Promise
- 有许多方法可以实现代码的异步性。回调、内置函数(如
)和setTimeout
是一些常见的函数Promises
- 将函数标记为
并不是使其真正异步的原因。它允许您在希望等待承诺的地方使用关键字async
wait
- 是的,
只能与await/async
一起使用。它们对于以命令式(sync)样式表示应用于异步代码的分支和更复杂的流控制非常有用Promise
您的
wait
功能是同步的。当你从fn
使用它时,你期望发生什么?@另一个人请帮助我理解。我将wait转换为async。但似乎仍没有如预期那样发挥作用。您的wait
功能是同步的。当你从fn
使用它时,你期望发生什么?@另一个人请帮助我理解。我将wait转换为async。但似乎仍没有如预期那样发挥作用。我来自C#world。提到异步会使函数异步。我的错。在链的深处,最终函数不是一直都是同步的吗?这个函数不应该告诉上层的每个人,请不要等我,在我回来之前要有这个承诺。我认为这一承诺将通过前面提到的异步来实现,就像在C#中一样。我会接受答案。在链的深处,最终函数不是一直都是同步的吗?
是的,它必须是同步的。这就是为什么我要做dotwoothings()。然后(…)
——我认为不可能在根级别上等待。至少,我不知道该怎么做…@ravi-在c#中只向函数添加async关键字并不能使任何东西异步。它只允许您在其中使用waitmethod@FredrikLundin. 正确的。返回任务不需要。这就是JS中的承诺。我现在什么都懂了。@Ravi虽然从技术上讲,它们不一定是100%精确的匹配,但我最终使用了几乎相同的心理模型,因为这个模型是a)简单的;b) “足够好”;c) 易于学习(因为这是建立在我已经知道的基础上的)。是的,我也是从.NET领域来到JS/TS的。我来自C#world。提到异步会使函数异步。我的错。在链的深处,最终函数不是一直都是同步的吗?这个函数不应该告诉上层的每个人,请不要等我,在我回来之前要有这个承诺。我认为这一承诺将通过前面提到的异步来实现,就像在C#中一样。我会接受答案。在链的深处,最终函数不是一直都是同步的吗?
是的,它必须是同步的。这就是为什么我要做dotwoothings()。然后(…)
——我认为不可能在根级别上等待。至少,我不知道该怎么做…@ravi-在c#中只向函数添加async关键字并不能使任何东西异步。它只允许您在其中使用waitmethod@FredrikLundin. 正确的。返回任务不需要。这就是JS中的承诺。我现在什么都懂了。@Ravi虽然从技术上讲,它们不一定是100%精确的匹配,但我最终使用了几乎相同的心理模型,因为这个模型是a)简单的;b) “足够好”;c) 易于学习(因为这是建立在我已经知道的基础上的)。是的,我是从.NET领域来到JS/TS的
function wait(ms){
var start = new Date().getTime();
var end = start;
while(end < start + ms) {
end = new Date().getTime();
}
}
const fn = async (value) => {
console.log("start fn ", value)
wait(2000);
console.log("end fn ", value)
return value;
}
const main = async () => {
var promiseForFn = fn(3);
console.log("promiseForFn ", promiseForFn);
var value = await promiseForFn;
console.log("value ", value);
}
main()
const wait = async(ms) => {
var start = new Date().getTime();
var end = start;
while (end < start + ms) {
end = new Date().getTime();
}
}
const fn = async(value) => {
console.log("start fn ", value)
await wait(2000);
console.log("end fn ", value)
return value;
}
const main = async() => {
var promiseForFn = fn(3);
console.log("promiseForFn ", promiseForFn);
var value = await promiseForFn;
console.log("value ", value);
}
main()
function wait(ms, text) {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('complete', text);
resolve({});
}, ms);
});
};
async function doTwoThings() { // This func will return a Promise
await wait(2000, 'BBB'); // - to which you can subscribe with `.then`
await wait(1000, 'AAA'); // - or `await` on within another `async` function.
return 'Both done';
}
doTwoThings()
.then(
result => console.info('Done done done!', result),
err => console.error('Oooops', err)
);