我一直试图理解为什么下面的代码没有抓住它throw.如果async从new Promise(async (resolve, ...部件中删除关键字,那么它可以正常工作,因此它与Promise执行程序是异步函数的事实有关.
(async function() {
try {
await fn();
} catch(e) {
console.log("CAUGHT fn error -->",e)
}
})();
function fn() {
return new Promise(async (resolve, reject) => {
// ...
throw new Error("<<fn error>>");
// ...
});
}
Run Code Online (Sandbox Code Playgroud)
这里的答案,这里和这里重复一遍"如果你在任何其他异步回调中,你必须使用reject",但是"异步"它们并不是指async函数,所以我认为它们的解释不适用于此(如果他们这样做,我不明白如何).
如果不是throw我们使用reject,上面的代码工作正常.从根本上说,我想明白为什么throw不在这里工作.谢谢!
我正在使用react-select来自动完成搜索栏中的选项.搜索栏以两种类别之一显示结果,具体取决于它命中的API端点.
现在,它可以处理来自任何一个点或另一个点的数据,但是我无法将数据从两个端点返回到react-select的loadOptions参数.
从这个关于多个API调用的答案,我决定使用promises一次返回所有数据,但是我得到了错误Uncaught TypeError: promise.then is not a function at Async.loadOptions
这是我的代码loadOptions:
const getAsync = (tripId, destinationIndex, input) => {
if (!input) {
return { options: [] }
}
function getMusement(input) {
return new Promise(function(resolve, reject) {
TVApi.musement.autocomplete(input)
.then((m) => {
const musementOptions = m.map(musementToOption).slice(0, 4)
return resolve(musementOptions)
})
})
}
function getFourSquare(tripId, destinationIndex, input) {
return new Promise(function(resolve, reject) {
TVApi.spot.autocomplete(tripId, destinationIndex, input)
.then((fs) => {
const fsOptions …Run Code Online (Sandbox Code Playgroud) 我正在使用.then为Promise编写代码。现在,我决定使用 await/async 来编写它。我已经调用的函数add_Lessons内的承诺,然后调用另一个函数中。那么该功能。这是我使用.then 的代码。
function create_section(sections,course_ID,i) {
return new Promise(
(resolve) => {
var s_duration = 0;
var sname = sections[i].name;
var s_obj = {
//some object;
}
var section_id;
DB.section.create(s_obj,function (err, data_s)
{
if (err) return next(err);
section_id = data_s._id;
var lesson = sections[i].lessons;
add_lessons(lesson,section_id,i)
.then(function(arr){
resolve(arr);
})
});
}
);
};
Run Code Online (Sandbox Code Playgroud)
这是使用await/async的代码。
function create_section(sections,course_ID,i) {
return new Promise(
async function resolve() {
var s_duration …Run Code Online (Sandbox Code Playgroud) 我正在努力在程序中创建一个简单的等待功能。我想使用Promise并尽可能地异步等待。到目前为止,我有:
function waitForCondition(conditionObj) {
var start_time = new Date().getTime()
function checkFlag() {
if (conditionObj.arg == conditionObj.test) {
console.log('met');
return new Promise(resolve => setTimeout(resolve, 1));
} else if (new Date() > start_time + 3000) {
console.log('not met, time out');
return new Promise(resolve => setTimeout(resolve, 1));
} else {
window.setTimeout(checkFlag, 1000);
}
}
checkFlag();
}
async function run() {
console.log('before');
await waitForCondition({arg: '1', test: '1'})
console.log('after');
}
run();
Run Code Online (Sandbox Code Playgroud)
它应该每1秒钟检查一次,最长为3秒。控制台应如下所示:
'before'
'met'
'after'
Run Code Online (Sandbox Code Playgroud) 如果连接到我的API时出错,有人可以帮我弄清楚如何在我的AngularJS工厂中返回硬编码数据.我的硬编码数据位于另一个名为"dataFactory"的工厂中.感谢您的帮助.
service.factory("ScheduleFactory", ['$http', '$resource', '$q', 'dataFactory', function($http, $resource, $q, dataFactory) {
var objFactory = {};
objFactory.getDaysOfWeek = function(includeWeekends) {
var days = [];
var API = $resource(restURL + '/daysOfWeek/');
API.query()
.$promise
.then(function(data) {
isEmpty = (data.length === 0);
if (!isEmpty) {
days = data;
};
})
.catch(function(error) {
console.log("rejected " + JSON.stringify(error));
var data = null;
days = dataFactory.daysOfWeek;
console.log(days.length); // returns 5
});
console.log("after promise " + days.length); // returns 'after promise 0'
return days;
};
Run Code Online (Sandbox Code Playgroud)
我的dataFactory定义如下:
dataApp.factory("dataFactory", function() …Run Code Online (Sandbox Code Playgroud) 我有一个函数,它返回一个javascript Promise,并在其中运行一些异步代码.异步代码需要在失败的情况下重试几次.我这样做,直到我观察到一些奇怪的行为让我想知道我是否正确行事.所以我不得不改变它.这两种方法都在这里.我知道为什么第一种方法(asyncFunc)不起作用,如果有人可以分享一些技术清晰度,我将不胜感激.对于第二种方法(ayncFunc_newer)有关如何更好地完成任何建议吗?
var _retryCount = 0;
// this is what I was doing
function asyncFunc () {
return new Promise(function(fulfill, reject) {
doAsync()
.then(fulfill)
.catch(retry);
function retry(promiseResult) {
if(_retryCount < 3) {
_retryCount++;
return asyncFunc();
}
else {
reject(promiseResult);
}
}
});
}
// this what I'm doing now
function ayncFunc_newer() {
return new Promise(function(fulfill, reject) {
var retryCount = 0;
doAsync()
.then(fulfill)
.catch(onReject);
function onReject(bmAuthError) {
if(retryCount < 3) {
retryCount++;
logWarning(error);
doAsync()
.then(fulfill)
.catch(onReject);
}
else {
fulfill(false); …Run Code Online (Sandbox Code Playgroud)我问了这个问题,并被告知要避免 Promise 构造函数反模式。我通读了链接的文章,但我不确定如何不使用反模式。这是函数:
db.getUserCount = function () {
return new Promise (function (resolve, reject) {
db.users.count().then(function (result) {
resolve (result);
}, function(e) {
reject (e);
});
});
Run Code Online (Sandbox Code Playgroud)
我所有的数据库查询都像上面那样编码。这是我不使用反模式的尝试,但由于我不完全理解它,我认为这种方式也不正确:
db.getUserCount = function () {
return new Promise (function (resolve, reject) {
db.users.count().then(function (result) {
return (result);
}).then(function(result) {
resolve(result);
}).catch(function(err) {
reject(err);
});
});
};
Run Code Online (Sandbox Code Playgroud)
因为我想写出好的代码,如果有人能花一点时间向我展示一个不使用反模式来使用上述函数的例子,那就太好了。
我希望在通过某些条件解决后停止承诺链.下面的代码可能有助于理解我在说什么.
function update(id, data) {
return new Promise((resolve, reject) => {
let conn;
pool.get()
.then((db) => {
conn = db;
if(Object.keys(data).length === 0) {
return resolve({ updated: 0 });
}
else {
return generateHash(data.password);
}
})
.then((hash) => {
conn.query("UPDATE ... ", (err, queryResult) => {
if(err) {
throw err;
}
resolve({ updated: queryResult.affectedRows });
});
})
.catch((err) => { ... })
});
}
Run Code Online (Sandbox Code Playgroud)
请注意,pool.get()是promise包装的API,用于从我创建的MySQL模块获取连接池.
我正在尝试做的是更新用户数据.并且为了节省服务器资源,如果没有要更新的数据,我避免更新(Object.keys(data).length === 0).
当我尝试这个代码时,即使没有数据要更新,第二个(更新数据库)总是会发生!
我读过这篇文章,但没有奏效.当我调用"return resolve();"时为什么没有停止承诺链?我该如何正确地阻止它?我真的很喜欢使用Promises,但有时候,这种事情会让我发疯.非常感谢帮助我解决这个问题.谢谢!
PS无论如何,我正在使用节点v6.2.2.
我知道这不在a的范围内,Array.map但是我想等到上一个项目完成其承诺之后再开始下一个项目.碰巧我需要等待前一个条目保存在数据库中才能向前移动.
const statsPromise = stats.map((item) => {
return playersApi.getOrAddPlayer(item, clubInfo, year); //I need these to wait until previous has finished its promise.
});
Promise.all(statsPromise)
.then((teamData) => {
..//
});
Run Code Online (Sandbox Code Playgroud)
playersApi.getOrAddPlayer 返回一个 new Promise
编辑
阅读更多内容,显示playerApi.getOrAddPlayer似乎很重要
getOrAddPlayer: function (item, clubInfo, year) {
return new Promise((resolve, reject) => {
var playerName = item.name.split(' '),
fname = playerName[0].caps(),
sname = playerName[1].caps();
Players.find({
fname: fname,
sname: sname,
}).exec()
.then(function(playerDetails, err){
if(err) reject(err);
var savePlayer = new Players();
//stuff
savePlayer.save()
.then(function(data, err){
if(err) …Run Code Online (Sandbox Code Playgroud) 大家好,我在 angular 中创建的邮政服务遇到了问题。当我调用服务时,努力从我的组件中捕获错误。我能够从服务中捕获错误,但我需要从我的组件中执行此操作以正确处理错误。任何建议将不胜感激。
服务
sendData(obj) {
let promise = new Promise((resolve) => {
this.http.post(this.URL, obj, this.httpOptions)
.toPromise()
.then(
res => {
console.log(res);
resolve(res);
}
)
//.catch((err) => {
// console.log(err);
// throw err;
//});
});
return promise;
}
Run Code Online (Sandbox Code Playgroud)
成分
this._myservice.sendData(this.myobj)
.then(function (res) {
console.log('data sent');
})
.catch(error => {
console.warn('from component:', error);
// this console warn never gets logged out
});
Run Code Online (Sandbox Code Playgroud)
我是否需要更新我的服务中的某些内容以允许我从组件中捕获错误?
javascript ×9
promise ×7
node.js ×4
async-await ×2
asynchronous ×2
es6-promise ×2
angular ×1
angularjs ×1
ecmascript-6 ×1
electron ×1
mongodb ×1
react-select ×1
reactjs ×1
typescript ×1