请考虑以下以串行/顺序方式读取文件数组的代码.readFiles
返回一个promise,只有在按顺序读取所有文件后才会解析.
var readFile = function(file) {
... // Returns a promise.
};
var readFiles = function(files) {
return new Promise((resolve, reject) =>
var readSequential = function(index) {
if (index >= files.length) {
resolve();
} else {
readFile(files[index]).then(function() {
readSequential(index + 1);
}).catch(reject);
}
};
readSequential(0); // Start!
});
};
Run Code Online (Sandbox Code Playgroud)
上面的代码可以工作,但我不喜欢按顺序进行递归递归.是否有一种更简单的方法可以重写此代码,以便我不必使用我的奇怪readSequential
功能?
最初我试图使用Promise.all
,但这导致所有readFile
调用同时发生,这不是我想要的:
var readFiles = function(files) {
return Promise.all(files.map(function(file) {
return readFile(file);
}));
};
Run Code Online (Sandbox Code Playgroud) 我正在编写一个运行API调用的函数,并通过偏移按顺序从一个巨大的数据库中请求JSON.解析JSON响应,然后将其中的后续数据上载到我们的Cloud Firestore服务器.
Nodejs(节点6.11.3)和最新的Firebase Admin SDK
信息按预期进行解析,并完美地打印到控制台.但是,当数据尝试上传到我们的Firestore数据库时,控制台会发送垃圾邮件并显示错误消息:
验证错误:错误:套接字挂起
(node:846)UnhandledPromiseRejectionWarning:未处理的promise promise(拒绝ID:-Number-):错误:从插件获取元数据失败,错误:socket挂断
偶尔:
验证错误:错误:读取ECONNRESET
forEach函数从下载的JSON中收集项目,并在上载到Firestore数据库之前处理数据.每个JSON最多有1000项数据(1000个文档值)通过forEach函数.我知道如果函数在上传集完成之前重复,这可能是个问题吗?
我是一个编码新手,并且明白这个功能的控制流程并不是最好的.但是,我找不到有关控制台打印的错误的任何信息.我可以找到有关套接字挂起的大量信息,但在Auth错误部分没有.
我使用生成的服务帐户JSON作为访问我们的数据库的凭据,该数据库使用firebase-adminsdk帐户.我们的数据库读/写规则目前是开放的,允许任何访问(因为我们正在开发没有真正的用户).
这是我的功能:
Firebase初始化和偏移归零
const admin = require('firebase-admin');
var serviceAccount = require("JSON");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "URL"
});
var db = admin.firestore();
var offset = 0;
var failed = false;
Run Code Online (Sandbox Code Playgroud)
运行该功能并设置HTTP标头
var runFunction = function runFunction() {
var https = require('https');
var options = {
host: 'website.com',
path: (path including an offset and 1000 row specifier),
method: 'GET',
json: true,
headers: {
'content-type': 'application/json',
'Authorization': 'Basic ' + …
Run Code Online (Sandbox Code Playgroud) 我想使用返回objectId数组列表的axios来获取API.在我获得列表objectId之后,我想使用promise获取对象的细节
我想到这样的事情
var objectDetail = [];
axios.get('apiendpoint/')
.then((response) => {
var listOfObjectId = response.data;
var chain = Promise.resolve()
for (var objectId of listOfObjectId) {
chain = chain.then(axios.get(`apiendpoint/${objectId}`)
.then((response) => {
objectDetail.push(response.data);
})
);
}
return chain;
}).then((chain) => {
console.log(chain);
return chain;
})
Run Code Online (Sandbox Code Playgroud)
上面的代码返回undefined,promise链对象不传递给then
方法调用.我的方法错了还是我错过了什么?谢谢
这是我读过的一些堆栈,可能是相关的: