有没有sleep比使用以下pausecomp函数更好的方法来设计JavaScript (从这里开始)?
function pausecomp(millis)
{
var date = new Date();
var curDate = null;
do { curDate = new Date(); }
while(curDate-date < millis);
}
Run Code Online (Sandbox Code Playgroud)
这不是JavaScript中Sleep的重复- 动作之间的延迟 ; 我希望在函数中间实现真正的睡眠,而不是在执行代码之前的延迟.
背景
我正在尝试将条带付款整合到我的网站中.我需要使用私有条带密钥创建条带用户.我将此密钥存储在我的服务器上,并调用服务器方法来创建用户.也许有另一种方法可以实现这一目标?这是条纹api(为方便起见,下面复制):https: //stripe.com/docs/api/node#create_customer
//stripe api call
var Stripe = StripeAPI('my_secret_key');
Stripe.customers.create({
description: 'Customer for test@example.com',
card: "foobar" // obtained with Stripe.js
}, function(err, customer) {
// asynchronously called
});
Run Code Online (Sandbox Code Playgroud)
我的尝试和结果
我一直在使用不同服务器代码的相同客户端代码.所有尝试都会在客户端的console.log(...)上立即给出undefined,但在服务器console.log(...)上给出正确的响应:
//client
Meteor.call('stripeCreateUser', options, function(err, result) {
console.log(err, result);
});
//server attempt 1
var Stripe = StripeAPI('my_secret_key');
Meteor.methods({
stripeCreateUser: function(options) {
return Meteor.wrapAsync(Stripe.customers.create({
description: 'Woot! A new customer!',
card: options.ccToken,
plan: options.pricingPlan
}, function (err, res) {
console.log(res, err);
return (res || err);
}));
}
});
//server attempt …Run Code Online (Sandbox Code Playgroud) 我需要一种方法使流星调用同步,以便在运行调用时代码等待结果完成,以便它可以继续到客户端上的下一行代码.
例如:
clientFunction = function(){
Meteor.call('serverFunction', function(err,result){})//<--so when this gets a result and
//is stored in a session variable
var doSomeThing = Session.get('whatever') <-- so that your able to use it here
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试做一个while循环来防止任何事情发生,直到返回一个值,但似乎它在clientFunction之后运行,从而将其抛给它的死亡
任何帮助都会被贬低
如何让客户端method.call等待异步函数完成?目前它到达函数的末尾并返回undefined.
Client.js
Meteor.call( 'openSession', sid, function( err, res ) {
// Return undefined undefined
console.log( err, res );
});
Run Code Online (Sandbox Code Playgroud)
Server.js
Meteor.methods({
openSession: function( session_id ) {
util.post('OpenSession', {session: session_id, reset: false }, function( err, res ){
// return value here with callback?
session_key = res;
});
}
});
Run Code Online (Sandbox Code Playgroud) 我是Meteor的新手,我正在尝试从Heroku API获取异步数据.
服务器端代码:
heroku = Meteor.require("heroku");
Meteor.methods({
'getHeroku': function getHeroku(app){
client = new heroku.Heroku({key: "xxxxxx"});
client.get_app(app, function (error, result) {
return result;
});
}
});
Run Code Online (Sandbox Code Playgroud)
客户端代码:
Template.herokuDashboard.helpers({
appInfo: function() {
Meteor.call('getHeroku', "meathook-api", function (error, result) {
console.warn(result);
} );
}
});
Run Code Online (Sandbox Code Playgroud)
Heroku需要一段时间才能回答,所以答案是undefined.
那么捕获异步结果的最佳方法是什么?
谢谢.
我一直在使用Meteor和条纹包来试图成为一个客户.所以首先我有我的客户端代码调用服务器上的方法所以当我点击我在client.js时:
Meteor.call('usersignup', function (error, result) {
console.log (result);
});
Run Code Online (Sandbox Code Playgroud)
所以这会调用server.js上的Method:
var Future = Npm.require('fibers/future');
var stripe = StripeAPI('my key'); // secret stripe API key
Meteor.methods({
usersignup: function(cusEmail){
var fut = new Future();
stripe.customers.create(
{ email: cusEmail },
function(err, customer) {
if (err) {
console.log(err);
fut.ret;
}
fut.ret(customer);
}
);
return fut.wait();
},
userfail: function(cusid){
var fut = new Future();
stripe.customers.retrieve(cusid, function(err, result) {
if(err){
console.log(err);
fut.ret;
}
fut.ret(err, result);
});
return fut.wait();
}
});
Run Code Online (Sandbox Code Playgroud)
现在,当我登录stripe.com仪表板时,这可以工作并创建一个客户,但我正在尝试将响应返回到客户端,至少现在是客户ID并将其打印在控制台中.这是我似乎无法让它工作的地方.当我执行console.log(结果)时,它将记录未定义.有任何想法吗?
编辑:所以我现在把光纤和条带键作为全局变量,并没有得到错误,但返回似乎没有返回任何值.所以在客户端我有:
'click #signupsubmit': function (event) …Run Code Online (Sandbox Code Playgroud) 我刚刚花了几个小时读取了诸如Meteor之类的答案:在Meteor.method中调用异步函数并返回结果
不幸的是,我仍然无法管理用户光纤或期货.
我想做一些相当简单的事情(我想!).
创建用户时,根据异步方法的结果将变量添加到用户对象.因此,想象一下,如果您将在名为BANK的第三方数据库服务器上调用我的异步方法,这可能需要几秒钟才能返回.
Accounts.onCreateUser(function(options,user){
var Fiber = Npm.require("fibers");
Fiber(function() {
BANK.getBalance(function(err, theBalance) {
if (err) return console.log(err);
_.extend(user,{
balance: theBalance;
});
});
}).run();
return user;
Run Code Online (Sandbox Code Playgroud)
});
所以上面发生的是调用BANK方法,但是当它返回时代码已经移动并且从不调用_.extend.
我尝试将返回调用放在光纤内部,这只会让事情变得更糟:它永远不会返回用户.好吧,但它已经过了3秒,所以到那时下游的一切都在拯救.
感谢您的任何帮助!
我正在努力让Braintree Payments在Meteor应用程序中运行.我一直试图返回生成令牌(服务器端,通过Meteor方法)的结果,以便在客户端使用.
我试过这个:
/server/braintree.js
Meteor.methods({
createClientToken: function() {
var token = gateway.clientToken.generate({
customerId: this.userId
}, function(err, response) {
clientToken = response.clientToken
return clientToken
}
)
console.log(token)
return token
}
})
Run Code Online (Sandbox Code Playgroud)
返回true.
我也试过这个:
Meteor.methods({
createClientToken: function() {
var clientToken
gateway.clientToken.generate({
customerId: this.userId
}, function(err, response) {
clientToken = response.clientToken
}
)
console.log(clientToken)
return clientToken
}
})
Run Code Online (Sandbox Code Playgroud)
哪个回报undefined.
将function(err, response)被异步调用,是吗?如果是这样,那就是问题的解释.似乎尝试从异步函数返回值是Javascript中的一个痛点.我已经阅读了一些SO答案(就像这一个,这一个和这一个),但似乎没有一个让我朝着正确的方向前进.
另外,我相信我可能需要使用Meteor的wrapAsync方法,对吗?我已经试过这(发现这个和这个相关的等等吧题),但似乎仍不能得到正确的事情.
感谢任何反馈.
更新:
有关将Braintree与Meteor集成的工作方法,请查看 …
meteor ×7
javascript ×5
asynchronous ×1
braintree ×1
call ×1
methods ×1
node-fibers ×1
node.js ×1
sleep ×1
synchronous ×1