Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.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
Angular 如何使用async和Wait?它';它不工作了_Angular_Typescript_Asynchronous_Async Await - Fatal编程技术网

Angular 如何使用async和Wait?它';它不工作了

Angular 如何使用async和Wait?它';它不工作了,angular,typescript,asynchronous,async-await,Angular,Typescript,Asynchronous,Async Await,好的,我有三个函数我希望第一个函数被执行以获得它的ID,然后第二个和第三个函数可以被执行,下面是一个例子: async persistAll() { await (this.AddElement()); this.AddElement2( this.Id); this.AddElement3( this.Id); } 正如我所说,我希望第一个函数先完成,然后其他函数才能完成它们的工作,SetTimeOut工作正常,但我不想使用它,因为它取决于我将发送多少数据。 以下

好的,我有三个函数我希望第一个函数被执行以获得它的ID,然后第二个和第三个函数可以被执行,下面是一个例子:

  async persistAll()
{
  await (this.AddElement());
   this.AddElement2( this.Id);
   this.AddElement3( this.Id);
   
}
正如我所说,我希望第一个函数先完成,然后其他函数才能完成它们的工作,SetTimeOut工作正常,但我不想使用它,因为它取决于我将发送多少数据。 以下是加法函数的示例:

   async AddElement (){
       let a = 1,
       let b = 2
       id= a+b
      return new Promise(resolve => {id})
}
这只是我想做的一个例子,不管怎样,它一点也不等待,我也试过了

Promise.resolve(id)

我做错了什么?谢谢。

我想这就是你想要的:

async persistAll(){
 this.id = await this.addElement();
 this.AddElement2( this.Id);
 this.AddElement3( this.Id);
}

async AddElement (){
       let a = 1,
       let b = 2
       id= a+b
      return new Promise(resolve => {id})
}

如果有一个沙箱或更多的代码来更好地理解您要做的事情,那将是非常有帮助的

我认为这就是您想要的:

async persistAll(){
 this.id = await this.addElement();
 this.AddElement2( this.Id);
 this.AddElement3( this.Id);
}

async AddElement (){
       let a = 1,
       let b = 2
       id= a+b
      return new Promise(resolve => {id})
}

如果有一个沙盒或更多的代码来更好地理解您要做的事情,那将非常有帮助。您的AddElement函数不是返回一个
承诺,而是返回一个
承诺。这是因为
async
/
await
是语法助手;对于异步函数,任何返回的值都会自动包装在承诺中

在您的情况下,可以让typescript通过显式注释返回类型来帮助您找到问题。改为编写此命令,它会给您一个编译器错误:

async AddElement (): Promise<number>{
   let a = 1,
   let b = 2
   id= a+b
   return new Promise(resolve => {id})
}
这是一个例子。它产生以下输出:

[LOG]: "AddElement",  3
[LOG]: "AddElement2", 3
[LOG]: "AddElement3",  3
[LOG]: "Done"
以下是该游乐场的完整代码供参考:

const example = {
    Id: 0,

    async persistAll()
    {
        this.Id = await (this.AddElement());
        this.AddElement2(this.Id);
        this.AddElement3(this.Id);
    },

    async AddElement(): Promise<number>{
        let a = 1;
        let b = 2;
        const id = a+b;
        console.log("AddElement", id);
        return id;
    },

    AddElement2(id: number) {
        console.log("AddElement2", id);
    },

    AddElement3(id: number) {
        console.log("AddElement3", id);
    }
}

example.persistAll().then(() => console.log("Done"));
const示例={
Id:0,
异步persistAll()
{
this.Id=wait(this.AddElement());
本附录2(本Id);
本附录3(本Id);
},
异步AddElement():承诺{
设a=1;
设b=2;
常数id=a+b;
console.log(“AddElement”,id);
返回id;
},
附录2(id:编号){
console.log(“AddElement2”,id);
},
附录3(id:编号){
console.log(“AddElement3”,id);
}
}
然后(()=>console.log(“完成”);

您的AddElement函数不是返回一个
承诺,而是返回一个
承诺。这是因为
async
/
await
是语法助手;对于异步函数,任何返回的值都会自动包装在承诺中

在您的情况下,可以让typescript通过显式注释返回类型来帮助您找到问题。改为编写此命令,它会给您一个编译器错误:

async AddElement (): Promise<number>{
   let a = 1,
   let b = 2
   id= a+b
   return new Promise(resolve => {id})
}
这是一个例子。它产生以下输出:

[LOG]: "AddElement",  3
[LOG]: "AddElement2", 3
[LOG]: "AddElement3",  3
[LOG]: "Done"
以下是该游乐场的完整代码供参考:

const example = {
    Id: 0,

    async persistAll()
    {
        this.Id = await (this.AddElement());
        this.AddElement2(this.Id);
        this.AddElement3(this.Id);
    },

    async AddElement(): Promise<number>{
        let a = 1;
        let b = 2;
        const id = a+b;
        console.log("AddElement", id);
        return id;
    },

    AddElement2(id: number) {
        console.log("AddElement2", id);
    },

    AddElement3(id: number) {
        console.log("AddElement3", id);
    }
}

example.persistAll().then(() => console.log("Done"));
const示例={
Id:0,
异步persistAll()
{
this.Id=wait(this.AddElement());
本附录2(本Id);
本附录3(本Id);
},
异步AddElement():承诺{
设a=1;
设b=2;
常数id=a+b;
console.log(“AddElement”,id);
返回id;
},
附录2(id:编号){
console.log(“AddElement2”,id);
},
附录3(id:编号){
console.log(“AddElement3”,id);
}
}
然后(()=>console.log(“完成”);

谢谢您的回复,但它仍然不起作用我甚至在AddElement()之后添加了一个控制台日志,但它直接从控制台日志开始…我希望函数至少100%执行,然后传递到第二个函数我将建议的代码复制到了一个typescript游戏场,并将其编辑为我的原始答案。您的代码中必须有一个在原始问题中缺失的细节。你能发布一个最小的方法来重现你的问题吗?谢谢你的回复,但它仍然不起作用,我甚至在AddElement()之后添加了一个控制台日志但它直接从控制台日志开始…我希望至少100%执行该函数,然后传递到第二个函数。我将建议的代码复制到一个typescript中,并将其编辑为我的原始答案。您的代码中必须有一个在原始问题中缺失的细节。你可以发布一个最小的方法来重现你的问题吗?谢谢你的回复,但我做了同样的事情,但它仍然不起作用…我希望函数至少100%执行,然后传递到第二个函数,你根本不需要在AddElement中使用async,谢谢你的回复,但我做了同样的事情,但它仍然不起作用…我希望函数至少100%执行,然后传递给第二个函数,你根本不需要在AddElement中使用async,因为它的工作方式与你所期望的相同。