我无法理解当我们简单地返回一个值或当我们返回 Promise.resolve() 时会发生什么从一个函数。具体来说:我正在尝试了解 promises chaining 的工作原理。我正在链接方法并验证值是否达到最后一次调用 then 的方法中.我只想了解将 promise 返回给 then 之间的区别, 返回 Promise.resolve()至 then , 并只返回一个值给 then .
最佳答案
I have problem in understanding that what happens when we simply return a value or when we return
Promise.resolve()from a function.
所以有(至少)两种不同的场景:
如果它只是任何旧函数(不是 then 或 catch 回调),那么区别在于 return value; 直接返回值,而 return Promise.resolve(value); 返回一个 promise 用该值实现。它改变了调用代码使用结果的方式。在 return value; 的情况下,调用代码直接使用它。在 return Promise.resolve(value); 的情况下,调用代码需要使用 promise ,就像任何其他 promise 一样(并且不能假设 promise 已经解决,即使它是).
如果该函数是一个 promise 链的开始,您可以使用 return Promise.resolve(value);。 (这有一些用例;例如,如果函数可能需要也可能不需要启动异步过程:在不需要的分支中,您仍然会返回一个 promise ,因为分支必须做某事异步必须返回一个 promise 。)如果不是,您只需使用 return value;。
then或catch回调中I am trying to understand how promises chaining works.
在那种情况下,您是在谈论 return value; 与 return Promise.resolve(value); 在 then 或catch 回调。这很简单:在 then 或 catch 回调中 return Promise.resolve(value); 根本没有意义,这是多余的和不必要的开销;只需使用返回值;。
then 和 catch 总是返回 promise 。如果您的回调返回一个简单值 (return value;),则 promise 会用该值实现。如果您的回调返回一个 thenable(松散地,一个 promise ;例如,return Promise.resolve(value);),那么 then 返回的 promise >/catch is resolved to that thenable:当 thenable 被解决时,promise 以同样的方式被解决。 (如果您的 then 或 catch 回调抛出错误,promise 将因该错误而被拒绝。)
如果您要在回调中启动一个新的异步进程,则有充分的理由从 then 或 catch 回调中返回 promise ;但是,如果您已经准备好一个立即值,那么将它包装在一个 promise 中是没有意义的——then 和 catch 已经这样做了。
关于javascript - 返回值和从函数返回 Promise.resolve() 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47279054/
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee
我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行
我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是