Javascript 我在这里拒绝承诺有什么错?
所以我在这里为node编写了一些可重用的代码,并通过async/await应用它。虽然我相信我在这里工作时会有很多误解。。。但是,我发誓,我有一个项目,我正在使用这段代码,它是有效的,而另一个项目,它没有。 Im使用Javascript 我在这里拒绝承诺有什么错?,javascript,node.js,request,request-promise,Javascript,Node.js,Request,Request Promise,所以我在这里为node编写了一些可重用的代码,并通过async/await应用它。虽然我相信我在这里工作时会有很多误解。。。但是,我发誓,我有一个项目,我正在使用这段代码,它是有效的,而另一个项目,它没有。 Im使用请求和请求承诺 UrlRequest: function( opts ) { return new Promise( (resolve, reject) => { request( opts, function(error, r
请求
和请求承诺
UrlRequest: function( opts ) {
return new Promise( (resolve, reject) => {
request( opts,
function(error, request, body) {
if (error)
reject( {error: true, msg: error} );
else
resolve( {body, request} );
});
})
.catch(err => reject( {error: true, msg: err} ));
}
我相当肯定
.catch()
是错误的。但在我的第一个项目中没有出错。所以我想找出正确的方法。在我读过的几篇文章中,我提出了这个函数的用法。我还知道如果实际发生任何错误(包括本例),它将抛出未处理的PromisejectionWarning
错误。那么这是如何正确处理的呢
我如何使用它:
(async () => {
var result = await Promise.UrlRequest( {
url: "...",
method: "GET",
headers: DefaultHeaders
} );
// do stuff with result...
}) ();
使用
请求承诺
,您不需要编写自己的承诺
包装器
// make sure you're using the promise version
const request = require('request-promise')
var opts = {
...
resolveWithFullResponse: true // <--- <--- to get full response, response.body contains the body
};
// if you dont plan to use UrlRequest as constructor, better name is starting with lowercase: urlRequest, some naming convention
UrlRequest: async function( opts ) {
let res;
try {
res = await request(opts);
} catch (e) {
// handle error
throw e
}
return res;
}
//确保您使用的是promise版本
const request=require('request-promise')
变量选项={
...
resolveWithFullResponse:true/使用请求承诺
,您不需要编写自己的承诺
包装器
// make sure you're using the promise version
const request = require('request-promise')
var opts = {
...
resolveWithFullResponse: true // <--- <--- to get full response, response.body contains the body
};
// if you dont plan to use UrlRequest as constructor, better name is starting with lowercase: urlRequest, some naming convention
UrlRequest: async function( opts ) {
let res;
try {
res = await request(opts);
} catch (e) {
// handle error
throw e
}
return res;
}
//确保您使用的是promise版本
const request=require('request-promise')
变量选项={
...
resolveWithFullResponse:true/因为您已经安装了请求承诺
,您不需要在执行时构建承诺。只需使用it而不是请求
,您就可以返回承诺。类似于此的操作应该可以:
const request = require('request-promise')
request(opts)
.then((res) => {
// Process res...
})
.catch((err) => {
// Handle error...
});
您可以继续将其包装在UrlRequest
函数中,并与async
一起使用,如下所示:
UrlRequest: async ( opts ) => {
try {
const response = await request(opts);
return response;
} catch (error) {
// Handle error
}
}
如果要使用then()
和catch()
,可以执行以下操作:
UrlRequest: ( opts ) => {
return request(opts)
.then(response => response)
.catch (error) {
// Handle error
}
}
由于您已经安装了request-promise
,因此您不需要像现在这样构造promise
。只需使用it而不是request
,您就可以返回一个promise。类似于此的操作应该可以:
const request = require('request-promise')
request(opts)
.then((res) => {
// Process res...
})
.catch((err) => {
// Handle error...
});
您可以继续将其包装在UrlRequest
函数中,并与async
一起使用,如下所示:
UrlRequest: async ( opts ) => {
try {
const response = await request(opts);
return response;
} catch (error) {
// Handle error
}
}
如果要使用then()
和catch()
,可以执行以下操作:
UrlRequest: ( opts ) => {
return request(opts)
.then(response => response)
.catch (error) {
// Handle error
}
}
如果您使用的是请求承诺,为什么要从请求手动创建承诺?为您做到这一切——正确地——是请求承诺的重点。我本以为请求承诺请求不会接受回调未处理的PromisejectionWarning错误。那么如何正确处理此问题呢?
使用try/catch块你不在var result=wait Promise.UrlRequest
中尝试同时使用回调和catch()
。据我所知,没有任何形式的request()
支持这一点。对于request()
库,它将只是回调。对于request-Promise())
library,它将只有.then()
和.catch()
,根本没有回调。@jfriend00:对不存在的拒绝的缩进和引用是误导性的;.catch()
在新承诺(…)
。如果您使用请求承诺,为什么要从请求手动创建承诺?正确地为您执行所有这些操作是请求承诺的重点。我本以为请求承诺请求不会接受回调未处理的PromisejectionWarning错误。那么如何正确处理此问题?
使用try/catch块,您在var result=wait Promise.UrlRequest
中没有使用回调和catch()
。据我所知,没有任何形式的request()
支持这一点。对于request()
库,它将只是回调。对于request-Promise()
库,它只有.then()
和.catch()
,根本没有回调。@jfriend00:对不存在的拒绝的缩进和引用是误导性的;.catch()
在新承诺(…)
上。放置.then()
和.catch()会引起任何问题吗
在我的UrlRequest函数中?它是一个模块,将在几个项目中重复使用。但是感谢But用例!不,它不会导致任何问题。您可以使用then()
和catch()
而不是try-and-catch块。放置.then()
和catch()会导致任何问题吗
在我的UrlRequest函数中?它是一个将在几个项目中重复使用的模块。但是感谢But用例!不,它不会导致任何问题。您可以使用then()
和catch()
而不是try-and-catch块。