“未设置任何响应。是否在异步调用中使用了该响应,但未作为对意图处理程序的承诺返回?”使用js

时间:2018-08-27 17:35:39

标签: javascript node.js fetch dialogflow actions-on-google

这是产生错误的代码,该意图在被调用时生成的填充响应为“未设置响应。在异步调用中使用了该响应,该调用未作为对意图处理程序的承诺返回?我该怎么做才能纠正它?

app.intent('getCrypto', (conv,{crypto="ethereum",cryptoactions="price"}) =>{
     fetch('https://api.coinmarketcap.com/v1/ticker/').then(response => {
       return response.json();
     }).then(data => {
          for (let i = 0; i < data.length - 1; i++) {
            if (data[i].id === "bitcoin")
               conv.data.price=data[i].price_usd;
               conv.ask(`${conv.data.price} is the current value of ${crypto}`);
               return response.json();
          }

     }).catch(err => {
          return conv.ask(`${cryptoactions} of ${crypto} is not available. Would you like to know about another one?`);
     });
});

2 个答案:

答案 0 :(得分:2)

错误消息描述了确切的问题“不是在未作为对意图处理程序的承诺的情况下返回的异步调用中使用了它吗?”

您应该从意图处理程序返回异步调用。因此,在致电return之前添加fetch应该可以解决此问题。

答案 1 :(得分:0)

为避免在Dialogflow API version 2中出现此问题,

您必须return Promise,您是否愿意使用这些结构?

app.intent('getCrypto', conv => {
    // I - MUST HAVE PROMISE IN HERE
    return new Promise(function (resolve, reject) {
        fetch('https://api.coinmarketcap.com/v1/ticker/')
            .then(res => {
                ...

                resolve();
            })
            .catch(error => {
                console.log(error);

                reject(error)
            });
    })
    .then(function (result) {
        console.log(result);

        // II - MUST HAVE THIS RESPONSE
        // conv.ask(new SimpleResponse("..."));
        conv.close(new SimpleResponse(texts.goodbye));
    }, function (error) {

    });
})