- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将文件及其详细信息保存在数据库中。
waterfall 函数有两次调用,但第二个函数不等待第一个函数完成。
即使不使用 waterfall ,每个系列也无法按预期工作。它不会等待记录被创建,因此由于相同的 id 会发生唯一性错误。我在这里做错了什么以及如何解决它?
谢谢!
async.eachSeries(uploadedPhotos, async function (uploadedFile, callback) {
async.waterfall([
async function() {
var lastUser = await TblUserFiles.find({}).sort('id DESC').limit(1);
// fileID remains undefined if i remove async-await from the function
var fileID = lastUser[0].id;
fileID += 1;
cbb(null, fileID, uploadedFile);
},
async function(file_id, uploadedFile, cbb) {
sails.log("save file id is " + file_id);
sails.log("savee file id is " + uploadedFile['filename']);
var today = moment(new Date()).format('YYYY-MM-DD HH:mm:ss');
await TblUserFiles.findOrCreate({ customer_no: req.session.userId, file_type: 'profile_image' }, {
id: fileID,
customer_no: req.session.userId,
file_name: uploadedFile['filename'],
file_type: 'profile_image',
is_approved: 'No',
approved_by: 0,
approved_on: today,
approved_from: ip,
uploaded_date: today,
modified_date: today
}).exec(async (err, user, wasCreated) => {
if (err) { return res.serverError(err); }
if (wasCreated) {
// created a new user
sails.log("new file was uploaded...")
return cbb(err, "done");
// return res.send("sent");
}
else {
// found existing user
var user = await TblUserFiles.create({
id: fileID,
customer_no: req.session.userId,
file_name: uploadedFile["filename"],
file_type: "image",
is_approved: "No",
approved_by: 0,
approved_on: today,
approved_from: ip,
uploaded_date: today,
modified_date: today
}).intercept(err => {
// Return a modified error here (or a special exit signal)
// and .create() will throw that instead
err.message = "Uh oh: " + err.message;
return err;
}).fetch();
if (user) {
sails.log("found existing files..")
return cbb(err, "done");
}
sails.log("this should not be called");
}
});
}
], (err, success) => {
if (err) sails.log(err);
return callback(err, 'done')
});
}, function (err) {
// if any of the saves produced an error, err would equal that error
if (err) {
sails.log(err);
} else {
return res.json({
message: uploadedPhotos.length + ' file(s) uploaded successfully!',
files: uploadedPhotos
});
}
});
最佳答案
更新的答案:
我重写了代码。我忘记了 async.js 以不同的方式处理 Promise。基本上,您不使用callback()
。请改用 return
。如果发生错误,请使用抛出新的Error(message)
。请参阅here了解更多信息。阅读主题:使用 ES2017 异步函数。
async.eachSeries(uploadedPhotos, async uploadedFile => {
var lastUser = await TblUserFiles.find({}).sort('id DESC').limit(1);
var fileID = lastUser[0].id;
fileID += 1;
sails.log("save file id is " + file_id);
sails.log("savee file id is " + uploadedFile['filename']);
var today = moment(new Date()).format('YYYY-MM-DD HH:mm:ss');
await TblUserFiles.findOrCreate(
{ customer_no: req.session.userId, file_type: 'profile_image' },
{
id: fileID,
customer_no: req.session.userId,
file_name: uploadedFile['filename'],
file_type: 'profile_image',
is_approved: 'No',
approved_by: 0,
approved_on: today,
approved_from: ip,
uploaded_date: today,
modified_date: today
}
).exec(async (err, user, wasCreated) => {
if (err) throw new Error(err);
if (wasCreated) {
sails.log("new file was uploaded...");
return;
} else {
await TblUserFiles.create({
id: fileID,
customer_no: req.session.userId,
file_name: uploadedFile["filename"],
file_type: "image",
is_approved: "No",
approved_by: 0,
approved_on: today,
approved_from: ip,
uploaded_date: today,
modified_date: today
})
.intercept(err => {
throw new Error("Uh oh: " + err.message);
}).fetch();
if (user) {
sails.log("found existing files..");
return;
} else {
sails.log("this should not be called");
return;
}
}
});
}, err => {
// Don't call res.serverError() or res.json() inside the async loop!
if (err) {
sails.log(err);
res.serverError(err);
}
else {
res.json({
message: uploadedPhotos.length + ' file(s) uploaded successfully!',
files: uploadedPhotos
});
}
});
<小时/>
我认为这里的第一个问题是你忘记给第一个任务提供回调函数(在本例中为 cbb)。
async.waterfall([
async function(cbb) {
var lastUser = await TblUserFiles.find({}).sort('id DESC').limit(1);
// fileID remains undefined if i remove async-await from the function
var fileID = lastUser[0].id;
fileID += 1;
cbb(null, fileID, uploadedFile);
},
async function(file_id, uploadedFile, cbb) {
...
其次,您不应该返回回调。回调是一个函数而不是一个 promise 。正常使用即可。
<小时/>顺便说一下,const async = require('async');
不会覆盖 async
关键字。编译器可以区分它们之间的区别。下面的脚本示例证明了这一点:
const async = require('async');
let runPromise = (name, timer, success = true) => {
console.log(`${name} starts.`);
return new Promise((resolve, reject) => {
if (success) {
setTimeout(function () {
resolve(`${name} finished after ${timer / 1000} seconds(resolved).`);
}, timer);
} else {
reject(`${name} failed(rejected).`);
}
});
};
async function asyncFunction() {
let txt = await runPromise('A', 1000);
console.log(txt);
}
asyncFunction();
关于javascript - Nodejs 异步 waterfall 回调函数未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53370636/
我正在使用异步 waterfall ,我有一个关于 try/catch 错误的问题。 我不想用一个全局 try/catch 来回避这种语法方法,并且不能通过函数重复 try/catch : async
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想要改善这个问题吗?更新问题,以便将其作为on-topi
我正在阅读有关软件开发模型和生命周期的内容,在那里我了解了瀑布模型和统一流程。然而,这两个过程都涉及需求收集、设计阶段、开发测试和部署(统一过程中的初始、细化、构建和过渡阶段)。 任何人都可以帮助我解
假设我有一个具有异步方法的对象数组: [ { partOne: function(input) { // Do something async }, partT
我有一组必须按顺序执行的读取命令。任何失败,处理都会停止。 readCommands 是一个读取函数数组... async.waterfall(readCommands, function(err)
除了相对琐碎的功能之外,我倾向于害怕为任何东西编写 Javascript 的原因之一是我从来没有找到一种合适的方法来避免当一件事真正依赖于另一件事时的回调瀑布。有这样的方法吗? 我现在正在开发 Tit
这个问题在这里已经有了答案: How to structure nested Promises (3 个答案) 关闭 6 年前。 我是一名 API 开发人员,通常编写需要将结果从一个异步调用传递到另
我尝试使用 async.waterfall 来清理我的代码。我有两个问题,这是我的代码。 async.forEachOf(req.files, (value, key, callback) => {
这个问题已经有答案了: For-loop and async callback in node.js? (3 个回答) 已关闭 9 年前。 我有以下异步代码。 for fileName in so
我正在使用npm异步 waterfall 方法来编写功能。在那里我发现了一个奇怪的情况(可能是我的意识低)。我的功能如下。我在第一个函数中创建一个事件数组,并通过回调参数将其传递给第二个函数。然后我在
我正在尝试实现一个架构,其中客户拥有订单和发货历史记录。我正在尝试使用 API 调用将该数据导入到另一个系统,但问题是我无法使用单个 API 调用导入所有客户数据。我正在使用 Promise 创建 w
从下面的代码中我没有得到 result1 数据。这是未定义的。有人可以帮助我吗? async.waterfall([ function(callback) { request(
我第一次使用async.waterfall,但遇到了一些麻烦。 这是我尝试调用的两个函数: function generateImageURL(data, callback){ // ... x
如何创建像 Chrome Inspector、GTMetrix 这样的网站 waterfall/时间线? 我需要在网站打开时获取数据。加载整个网站时浏览器发出了多少请求。请求发生的地点等。 是否有任何
有两个调用的 waterfall 函数,但第二个调用没有等待第一个完全完成。第一个有一个 mongodb.find() 调用。这是异步 waterfall 函数 app.get("/news", fu
我正在尝试执行 waterfall 式异步,但没有得到我想要的预期输出。如果我使用数组而不是查询,基本上我的 waterfall 会按预期工作所以我想我在查询的回调中做错了什么,但我不知道是什么。 当
我正在尝试将数据返回到我的 View 模板。我正在使用 async.waterfall 来执行此操作。只有一个问题,类的结果总是undefined Controller : Profile().the
我正在使用 node.js 和异步包。 这是我的代码: async.waterfall( [ function(callback) { var data = getSomeDa
我正在实现一个用 Node.js 编写的项目,并从 Mysql 获取值。随着我在项目中的深入,我的嵌套回调是这样的 hold.getEntry(function(data){ var ref
我需要保存到异步 waterfall 系列内的数据库。 我尝试在 clean 函数之后集成这两个函数 function connectDb(next) {
我是一名优秀的程序员,十分优秀!