我正在尝试在使用反模式的地方重构代码,但仍然不知道如何精确地重构这样的东西: 我有一个现在可以像这样工作的函数:
export async function submit(data) {
return new Promise(async function(resolve, reject) {
...
let list = await getList();
...
for (let i = 0; i < list.length; i++) {
let data = await getData(list[i]);
}
...
for (let i = 0; i < list.length; i++) {
let response = await uploadFile(list[i]);
}
我将这个函数称为:
let response = await submit(data);
我知道新Promise中的异步功能是个问题,但是如何解决?
export async function submit(data) {
return new Promise(async function(resolve, reject) {
let files = getFiles();
let prepareUrlsResponse = await prepareUrls(paths);
if (prepareUrlsResponse.error === true) {
resolve( { success: false });
} else {
let blobs = [];
for (let i = 0; i < prepareUrlsResponse.data.length; i++) {
let fileData = await RNFetchBlob.fs.stat(filePath);
blobs.push(fileData);
}
for (let i = 0; i < blobs.length; i++) {
let item = blobs[i];
let response = await uploadFile(
item.url,
item.blob
);
if (response && response.uploadSuccess === false) {
resolve( { success: false });
break;
}
}
}
api.post(
endpoint,
data,
response => {
if (response.ok) {
resolve( { success: true, response: response });
} else {
resolve( { success: false });
}
}
);
});
}
答案 0 :(得分:3)
只需完全删除该行。您的submit
已经是async function
,您可以直接在其中使用await
。无需围绕整个对象创建一个new Promise
,只需要promisfy api.post
调用即可。您应该将其分解为一个返回诺言的单独函数,并像在您要调用的其他函数上那样使用await
。
function postData(url, data) {
return new Promise(function(resolve, reject) {
// ^^^^^^^^ no `async` here!
api.post(url, data, resolve);
});
}
export async function submit(data) {
let files = getFiles();
let prepareUrlsResponse = await prepareUrls(paths);
if (prepareUrlsResponse.error === true) {
return { success: false };
} else {
let blobs = [];
for (let i = 0; i < prepareUrlsResponse.data.length; i++) {
let fileData = await RNFetchBlob.fs.stat(filePath);
blobs.push(fileData);
}
for (let i = 0; i < blobs.length; i++) {
let item = blobs[i];
let response = await uploadFile(
item.url,
item.blob
);
if (response && response.uploadSuccess === false) {
return { success: false };
}
}
}
const response = await postData(endpoint, data);
if (response.ok) {
return { success: true, response: response });
} else {
return { success: false };
}
}
您当然可以内联postData
调用并使用const response = await new Promise(…);
,但是您应该只包装回调部分而不是整个逻辑。