尝试使用async
和await
在nodejs中执行http请求,但收到错误。有任何想法吗? THX
got response:
undefined
/home/tom/learn/node/node_modules/node-rest-client/lib/node-rest-client.js:539
callback(parsedData,res);
^
TypeError: callback is not a function
at /home/tom/learn/node/node_modules/node-rest-client/lib/node-rest-client.js:539:13
at Object.parse (/home/tom/learn/node/node_modules/node-rest-client/lib/nrc-parser-manager.js:151:3)
at ConnectManager.handleResponse (/home/tom/learn/node/node_modules/node-rest-client/lib/node-rest-client.js:538:32)
at ConnectManager.handleEnd (/home/tom/learn/node/node_modules/node-rest-client/lib/node-rest-client.js:531:18)
at IncomingMessage.<anonymous> (/home/tom/learn/node/node_modules/node-rest-client/lib/node-rest-client.js:678:34)
at emitNone (events.js:110:20)
at IncomingMessage.emit (events.js:207:7)
at endReadableNT (_stream_readable.js:1059:12)
at _combinedTickCallback (internal/process/next_tick.js:138:11)
at process._tickCallback (internal/process/next_tick.js:180:9)
以下是脚本的源代码
var Client = require('node-rest-client').Client;
var client = new Client();
async function test1() {
response = await client.get("http://localhost/tmp.txt");
console.log("got response: ");
console.log(response.headers);
};
test1();
nodejs的版本是v8.4.0,在ubuntu 14.04上。
答案 0 :(得分:4)
async/await
不要只是神奇地处理期望回调的函数。如果client.get()期望将回调作为参数,那么如果您要使用它,则必须传递回调。 async/await
使用返回promise的异步操作,并对这些promise进行操作。他们不会神奇地让你跳过将回调传递给为回调设计的函数。我建议更多地了解如何实际使用async
和await
。
通常,async/await
的路径是首先设计所有async
操作以使用promises和.then()
处理程序。然后,在完成所有工作之后,您可以将函数声明为要使用等待的异步,然后在这些异步声明的函数中,您可以调用返回promises的函数,而不是使用.then()
处理程序。这里没有神奇的捷径。从承诺设计开始。
这是一个简单的承诺示例:
// asynchronous function that returns a promise that resolves to
// the eventual async value
function delay(t, val) {
return new Promise(resolve => {
setTimeout(() => {
resolve(val);
}, t);
});
}
function run() {
return delay(100, "hello").then(data => {
console.log(data);
return delay(200, "goodbye").then(data => {
console.log(data);
});
}).then(() => {
console.log("all done");
});
}
run();
而且,这里适合使用async/await
:
// function returning a promise declared to be async
function delay(t, val) {
return new Promise(resolve => {
setTimeout(() => {
resolve(val);
}, t);
});
}
async function run() {
console.log(await delay(100, "hello"));
console.log(await delay(200, "goodbye"));
console.log("all done");
}
run();
这两个例子都产生相同的输出和相同的输出时序,所以希望你能看到从promises到async / await的映射。
答案 1 :(得分:1)
function clientRest(args) {
return new Promise(resolve => {
client.post("url", args, (data,response)=> {
resolve(data)
})
})
}
let data_image = await clientRest(args)
答案 2 :(得分:0)
等待要求其参数返回一个承诺。你得到这个错误的原因是client.get(“http://localhost/tmp.txt”);没有回复承诺。
所以,有两种方法可以解决这个问题。