【问题标题】:How to return different promises from a function?如何从函数返回不同的承诺?
【发布时间】:2017-04-27 10:09:25
【问题描述】:
A function whose declared type is neither 'void' nor 'any' must return a value.

我有一个createOrder 函数,它应该返回一个承诺。我在函数中有数据库调用,我想在所有数据库操作完成后解决createOrder 函数的承诺。

问题是打字稿编译器不允许我从数据库函数返回承诺返回承诺,因为它认为函数声明(返回承诺)没有实现:

createOrder(order:Array<Cartitem>, sum:number):Promise<Array<Cartitem>> {
    this.db.put(newOrder)
        .then((r)=>{
           //other operations
           return new Promise<Array<Cartitem>>((resolve) => {
               resolve(order);
           });
        })
        .catch(function (err) {
           console.log('put order:', err);
           // return new Promise<Array<Cartitem>>((reject) => {
           //   reject(order);
           // });
        });
}

我可以在函数末尾返回一个 Promise,但这当然对除了编译器之外的任何东西都没有好处。我应该在这里使用简单的回调吗?

【问题讨论】:

  • 谢谢大家,这很快!

标签: javascript angularjs angular typescript


【解决方案1】:

根据您在“其他操作”中所做的事情,您可以使用通过在this.db.put 的承诺上调用then 创建的承诺:

createOrder(order:Array<Cartitem>, sum:number):Promise<Array<Cartitem>> {
    return this.db.put(newOrder)
        .then((r)=>{
           //other operations
           return order;                   // Resolves the one created by `then`
        })
        .catch(function (err) {
           console.log('put order:', err);
           throw err;                      // Rejects the one created by `then`
        });
    });
}

...或者如果由于某种原因你不能,请提前创建你的承诺,并在其初始化回调中调用this.db.put

createOrder(order:Array<Cartitem>, sum:number):Promise<Array<Cartitem>> {
    return new Promise<Array<Cartitem>>((resolve) => {
        this.db.put(newOrder)
            .then((r)=>{
               //other operations
               resolve(order);
            })
            .catch(function (err) {
               console.log('put order:', err);
               reject(err); // You had `order` here, but presumably it would be `err`
            });
    });
}

【讨论】:

    【解决方案2】:

    您可以将 Promise 作为函数的返回值返回,并在您的内部 Promise 回调中解决它:

    createOrder(order:Array<Cartitem>, sum:number):Promise<Array<Cartitem>>  
    {
       return new Promise<Array<Cartitem>>((resolve) => {
          this.db.put(newOrder)
            .then((r)=>{
                //other operations
               resolve(order);
            })
            .catch((err) => {
               console.log('put order:', err);
               reject(err);
            });
       });
    }
    

    【讨论】:

      【解决方案3】:

      试试类似的东西

      createOrder(order:Array<Cartitem>, sum:number):Promise<Array<Cartitem>> {
          return this.db.put(newOrder)
              .then((r)=>{
                 //other operations
                 return new Promise<Array<Cartitem>>((resolve) => {
                     resolve(order);
                 });
              })
              .catch(function (err) {
                 console.log('put order:', err);
                 // return new Promise<Array<Cartitem>>((reject) => {
                 //   reject(order);
                 // });
                 return null
              });
      
      }
      

      【讨论】:

        【解决方案4】:

        您实际上应该添加this.db.putreturn(以及它后面的整个表达式)。

        就目前而言,您正在调用 this.db.put,并在 then 分支中链接回调,但您没有向调用者返回任何内容。随后,调用者可能希望能够从 createOrder 的结果中取出 .then,但在普通的 JavaScript 中,它会失败,因为结果是未定义的。

        您也可以只在.then 中使用resolve(order),而不是返回数组等的Promise。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-04-05
          • 1970-01-01
          • 2019-01-23
          • 1970-01-01
          • 2014-08-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多