如何从函数中返回不同的承诺?

时间:2016-12-12 14:03:46

标签: javascript angularjs angular typescript

A function whose declared type is neither 'void' nor 'any' must return a value.

我有一个createOrder函数,应该返回一个promise。我在函数中有数据库调用,并且我希望在所有数据库操作完成后解析createOrder函数的承诺。

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

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,但除了编译器之外,这当然不好。我应该在这里使用简单的回调吗?

4 个答案:

答案 0 :(得分:3)

取决于您在&#34;其他操作中所做的事情,&#34;您可以使用then承诺this.db.put创建的承诺,如果可以的话:

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`
            });
    });
}

答案 1 :(得分:1)

尝试类似

的内容
Application & Application User

答案 2 :(得分:1)

您实际应该添加return this.db.put(及其后面的整个表达式)。

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

你也可以在resolve(order).then,而不是返回数组的承诺等。

答案 3 :(得分:1)

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

unzip myfile.zip
convmv --notest -r -f WINDOWS-1252 -t utf8