var funcs = [];
// let's create 3 functions
for (var i = 0; i < 3; i++) {
// and store them in funcs
funcs[i] = function() {
// each should log its value.
console.log("My value: " + i);
};
}
for (var j = 0; j < 3; j++) {
// and now let's run each one to see
funcs[j]();
}Run Code Online (Sandbox Code Playgroud)
它输出这个:
我的价值:3
我的价值:3
我的价值:3
而我希望它输出:
我的价值:0
我的价值:1
我的价值:2
使用事件侦听器导致运行函数的延迟时,会出现同样的问题:
var buttons = document.getElementsByTagName("button");
// let's create 3 …Run Code Online (Sandbox Code Playgroud)我正在映射数组,并且对于新对象的返回值之一,我需要进行异步调用.
var firebaseData = teachers.map(function(teacher) {
return {
name: teacher.title,
description: teacher.body_html,
image: urlToBase64(teacher.summary_html.match(/src="(.*?)"/)[1]),
city: metafieldTeacherData[teacher.id].city,
country: metafieldTeacherData[teacher.id].country,
state: metafieldTeacherData[teacher.id].state,
studioName: metafieldTeacherData[teacher.id].studioName,
studioURL: metafieldTeacherData[teacher.id].studioURL
}
});
Run Code Online (Sandbox Code Playgroud)
该函数的实现看起来像
function urlToBase64(url) {
request.get(url, function (error, response, body) {
if (!error && response.statusCode == 200) {
return "data:" + response.headers["content-type"] + ";base64," + new Buffer(body).toString('base64');
}
});
}
Run Code Online (Sandbox Code Playgroud)
我不清楚做到这一点的最佳方法是什么......承诺?嵌套回调?在ES6或ES7中使用一些东西然后用Babel进行转换?
目前实现这一目标的最佳方式是什么?
谢谢!
我尝试让CasperJS实现以下目标:
我得到了一些工作代码,但我不明白CasperJS是如何经历事件序列的.
例如,在下面的代码示例中,CasperJS尝试处理第2步,并抛出"ReferenceError:找不到变量:formDate",而第1步由于某种原因根本不执行.
我的推理有什么问题?
在我看来,while循环以与casper.then方法不同的速度执行.
casper.start();
casper.thenOpen('http://www.example.com', function() {
this.echo(this.getTitle());
});
casper.then(function() {
var start = new Date('2013-01-01T00:00:00');
var end = new Date('2013-01-31T00:00:00');
while(start < end) {
// step 1: define formDate
casper.then(function() {
var formDate = start.getFullYear()+"-"+("0" + (start.getMonth() + 1)).slice(-2) +"-"+("0" + start.getDate()).slice(-2) ;
casper.echo(formDate);
});
// Step 2: open the page and download the file
casper.thenOpen('http://www.example.com/' + formDate, function() {
var url = this.getElementAttribute('div#pdffulllink a.pdf', 'href');
this.echo(url);
this.download(url, 'Downloaded_' + …Run Code Online (Sandbox Code Playgroud) 我在请求中得到了一个字符串数组.每个字符串都包含要在本机shell上执行的命令.
var process = require('child_process');
function execCommand(req,res,callback){
var params = req.params.list //list is an array in the request
var result = '';
var command = '';
for (var i = 0; i < params.length; i++) {
command = params[i];
cmd = process.exec(command);
cmd.stdout.on('data', function(data){
//push the shell output in variable result
});
cmd.on('close', function(code) {
//convert the variable result to a valid JSON
});
}
res.send(result);
};
Run Code Online (Sandbox Code Playgroud)
所有命令的结果在result变量中混淆.如何使for循环中的函数调用同步?
让我澄清一下我的问题.我不是问如何使以下代码工作.我知道你可以使用let关键字或iffe来捕获它自己的值i.我只需要澄清如何i在以下代码中访问该值.我阅读了以下博客文章,了解以下代码是如何工作的.博客文章
for (var i = 1; i <= 5; i++) {
setTimeout(function() { console.log(i); }, 1000*i); // 6 6 6 6 6
}
Run Code Online (Sandbox Code Playgroud)
作者声称代码不起作用,因为我们将变量i作为引用而不是值传递.也就是说,我们不是提供i每次迭代的值,而是将变量setTimeout作为参考提供给回调.实际上,当循环终止并且回调触发时,我们将引用变量i,它将是6.这是如何工作的?
这是我的理解.我的理解是setTimeout,当循环执行时,我们不会将任何东西"传递"到函数的回调中.我们只是设置异步调用.当闭包回调函数执行时,它们会i根据词法作用域规则查找变量.也就是说,在范围内的闭包看起来是回调结束,在这种情况下再次,因为它是在for循环完成之后完成的.
它是哪一个,函数是否i根据在每次迭代时作为引用传递的变量或者因为词法作用域而将值解析为6?
我有以下代码:
var objectid = infos[i].id;
var name = infos[i].name;
return collection.aggregate([
{$match: {app: new ObjectId(objectid)}},
{$group: {_id: "$uid", amt: {$sum: 1}}}
])
Run Code Online (Sandbox Code Playgroud)
以前这段代码工作正常,但最近我开始在sails中获得以下stacktrace:
error: TypeError: Argument must be a string
at TypeError (native)
at Buffer.write (buffer.js:791:21)
at serializeObjectId (/Users/user/git/pivot/code/node_modules/sails-mongo/node_modules/bson/lib/bson/parser/serializer.js:242:10)
at serializeInto (/Users/user/git/pivot/code/node_modules/sails-mongo/node_modules/bson/lib/bson/parser/serializer.js:699:17)
at serializeObject (/Users/user/git/pivot/code/node_modules/sails-mongo/node_modules/bson/lib/bson/parser/serializer.js:280:18)
at serializeInto (/Users/user/git/pivot/code/node_modules/sails-mongo/node_modules/bson/lib/bson/parser/serializer.js:705:17)
at serializeObject (/Users/user/git/pivot/code/node_modules/sails-mongo/node_modules/bson/lib/bson/parser/serializer.js:280:18)
at serializeInto (/Users/user/git/pivot/code/node_modules/sails-mongo/node_modules/bson/lib/bson/parser/serializer.js:551:17)
at serializeObject (/Users/user/git/pivot/code/node_modules/sails-mongo/node_modules/bson/lib/bson/parser/serializer.js:280:18)
at serializeInto (/Users/user/git/pivot/code/node_modules/sails-mongo/node_modules/bson/lib/bson/parser/serializer.js:705:17)
at serialize (/Users/user/git/pivot/code/node_modules/sails-mongo/node_modules/bson/lib/bson/bson.js:47:27)
Run Code Online (Sandbox Code Playgroud)
这是抱怨,因为ObjectId我这样导入:
var ObjectId = require('mongodb').ObjectID;
Run Code Online (Sandbox Code Playgroud)
正如我之前所说,这工作正常但不再适用.我真的很困惑.如果我将objectId作为字符串,它将不会返回任何结果.如果我保持原样(因为它之前工作)它会抛出异常.这是什么问题?
我看过以下内容:
https://docs.mongodb.com/v3.0/reference/operator/aggregation/cmp/#exp._S_cmp
我能够在robomongo做到这一点:
db.getCollection("openevent").aggregate([
{$match: {app: new ObjectId(OBJECT_ID) }}, …Run Code Online (Sandbox Code Playgroud) 我正在Node中构建一个函数来查询我的mongoDB数据库并将一些结果返回到一个对象中.我无法正确设置对象.这是我的代码:
调用MongoDB查找的函数
$scope.listItems = $resource('http://10.1.1.21\\:3000/api/uniques/:query');
var itemsToList = [
'designer',
'store',
'category'
]
$scope.uniqueLists = {};
for(var i = 0; i<itemsToList.length; i++){
$scope.uniqueLists[itemsToList[i]] = [];
$scope.listItems.get({query:itemsToList[i]}, function(data){
console.log(itemsToList); // Returns ["designer", "store", "Category"] x3
console.log(itemsToList[i]); // Returns undefined, undefined, undefined
console.log('i = ' + i); // Returns 3, 3, 3 (which is really odd, ideas?)
$scope.uniqueLists[i] = data.query;
});
}
Run Code Online (Sandbox Code Playgroud)
此代码的问题在上面的注释中.奇怪的是,i == 3对于所有3个循环,当它应该相等0时1,然后完成2.
我的问题是
任何人都可以了解这里发生的事情吗?它可能与Node的异步行为有关,但我真的很茫然.
附加信息
我正在访问的ExpressJS电话$scope.listItems …
所以基本上我创建了一个循环,它从数组中获取值并使用 youtube api 将这些值放入循环中。如果我从循环内访问它,youtube 链接工作正常,但在循环外“(当我运行 console.log({urllist})”时,我得到一个空数组。我想要做的是推送所有值进入 urllist 空数组,然后将它们转移到状态变量('videos')
我所指的功能是 videoUrls
class MusicCharter extends React.Component{
constructor(){
super();
this.state= {
data:[],
videos:[],
}
}
componentDidMount(){
XHR.onreadystatechange = function(){
if(XHR.readyState === 4 && XHR.status === 200) {
var url = XHR.responseText;
this.setState({data:(JSON.parse(url).tracks.track)})
}
}.bind(this)
XHR.open("GET","http://ws.audioscrobbler.com/2.0/?method=chart.gettoptracks&api_key=xxxxxxx&format=json");
XHR.send();
}
videoUrls=()=>{
let i=0;
let urllist=[]
for(i;i< this.state.data.length;i++){
fetch(`https://www.googleapis.com/youtube/v3/search?part=snippet&q=${this.state.data[i].name}&key=xxxxxxxxxxx0`)
.then(response=> {
return response.json()
})
.then(data=>{
return(urllist.push(data.items[0]))})
}
console.log({urllist})
}Run Code Online (Sandbox Code Playgroud)
我不明白如何使用异步函数.
为什么下面的代码会停止主线程?
async function foo() {
for (;;) {}
}
foo();
Run Code Online (Sandbox Code Playgroud) javascript ×8
node.js ×4
asynchronous ×2
mongodb ×2
async-await ×1
casperjs ×1
closures ×1
es6-promise ×1
loops ×1
reactjs ×1
sails.js ×1
settimeout ×1
while-loop ×1